@@ -121,13 +83,11 @@ export default function SetlistViewer({ setlist }: { setlist: Setlist | null })
className="w-100 me-3"
color="success"
onClick={scrobbleSelectedTracks}
- disabled={allTracks.length < 1}
+ disabled={hasBeenScrobbled || !setlistIsValid}
>
0 && selectedTracks.size < allTracks.length
- ? 'scrobbleSelected'
- : 'scrobbleSetlist'
+ selectedTracks.size > 0 && selectedTracks.size < tracks.length ? 'scrobbleSelected' : 'scrobbleSetlist'
}
>
Scrobble setlist
@@ -141,12 +101,12 @@ export default function SetlistViewer({ setlist }: { setlist: Setlist | null })
isAlbum={true}
noMenu
analyticsEventForScrobbles="Scrobble individual setlist song"
- scrobbles={allTracks || []}
+ scrobbles={tracks || []}
albumHasVariousArtists={true}
onSelect={toggleSelectTrack}
selected={selectedTracks}
>
-
+
>
);
diff --git a/src/store/actions/setlistActions.js b/src/store/actions/setlistActions.js
index 006df38..881a6f1 100644
--- a/src/store/actions/setlistActions.js
+++ b/src/store/actions/setlistActions.js
@@ -7,7 +7,7 @@ export async function _setlistfmFindSetlist(setlistId) {
},
});
- if (data.setlist.sets && data.setlist.sets.length() > 0) {
- return data.setlist.sets[0].set;
+ if (data.setlist.tracks && data.setlist.tracks.length() > 0) {
+ return data.setlist.tracks[0].set;
}
}
diff --git a/src/utils/clients/setlistfm/apiClient.ts b/src/utils/clients/setlistfm/apiClient.ts
index b614959..6d9ee53 100644
--- a/src/utils/clients/setlistfm/apiClient.ts
+++ b/src/utils/clients/setlistfm/apiClient.ts
@@ -1,11 +1,7 @@
import axios from 'axios';
-import { SETLISTFM_API_URL } from 'Constants';
+import { OPENSCROBBLER_API_URL } from 'Constants';
export const setlistfmAPI = axios.create({
- baseURL: SETLISTFM_API_URL,
- params: {
- api_key: process.env.SETLISTFM_API_KEY,
- format: 'json',
- },
+ baseURL: `${OPENSCROBBLER_API_URL}/setlistfm.php`,
adapter: undefined,
});
diff --git a/src/utils/clients/setlistfm/index.ts b/src/utils/clients/setlistfm/index.ts
index 602bda9..e38b270 100644
--- a/src/utils/clients/setlistfm/index.ts
+++ b/src/utils/clients/setlistfm/index.ts
@@ -1 +1,2 @@
-export { setlistSearch } from './methods/setlistSearch';
+export { getSetlistById } from './methods/setlistGetById';
+export { searchSetlist } from './methods/setlistSearchByArtist';
diff --git a/src/utils/clients/setlistfm/methods/setlistGetById.ts b/src/utils/clients/setlistfm/methods/setlistGetById.ts
new file mode 100644
index 0000000..d835fe8
--- /dev/null
+++ b/src/utils/clients/setlistfm/methods/setlistGetById.ts
@@ -0,0 +1,12 @@
+import { setlistfmAPI } from 'utils/clients/setlistfm/apiClient';
+import { setlistTransformer } from '../transformers/setlist.transformer';
+
+export async function getSetlistById(setlistId) {
+ const { data } = await setlistfmAPI.get('', {
+ params: {
+ setlistId,
+ },
+ });
+
+ return setlistTransformer(data, true);
+}
diff --git a/src/utils/clients/setlistfm/methods/setlistSearch.ts b/src/utils/clients/setlistfm/methods/setlistSearch.ts
deleted file mode 100644
index 3ff90ed..0000000
--- a/src/utils/clients/setlistfm/methods/setlistSearch.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { setlistfmAPI } from 'utils/clients/setlistfm/apiClient';
-
-export async function setlistSearch(setlistId) {
- const { data } = await setlistfmAPI.get('', {
- params: {
- setlist_id: setlistId,
- },
- });
- return data;
-}
diff --git a/src/utils/clients/setlistfm/methods/setlistSearchByArtist.ts b/src/utils/clients/setlistfm/methods/setlistSearchByArtist.ts
new file mode 100644
index 0000000..5db0fb7
--- /dev/null
+++ b/src/utils/clients/setlistfm/methods/setlistSearchByArtist.ts
@@ -0,0 +1,12 @@
+import { setlistfmAPI } from 'utils/clients/setlistfm/apiClient';
+import { setlistSearchTransformer } from '../transformers/setlistSearch.transformer';
+
+export async function searchSetlist(artistName, page) {
+ const { data } = await setlistfmAPI.get('', {
+ params: {
+ artistName,
+ page: page > 1 ? page : undefined,
+ },
+ });
+ return setlistSearchTransformer(data);
+}
diff --git a/src/utils/clients/setlistfm/transformers.ts/setlist.transformer.ts b/src/utils/clients/setlistfm/transformers.ts/setlist.transformer.ts
deleted file mode 100644
index e8f4758..0000000
--- a/src/utils/clients/setlistfm/transformers.ts/setlist.transformer.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { MusicalSet, SetTrack, Setlist, Venue } from 'utils/types/setlist';
-import { SetlistFmArtist } from 'utils/types/artist';
-import { parse } from 'date-fns';
-
-export function setlistTransformer(raw: any) {
- const dateString = raw?.eventDate || null;
- let date = null;
- if (dateString) {
- date = parse(dateString, 'dd-MM-yyyy', new Date());
- }
- return {
- id: raw?.id || null,
- versionId: raw?.versionId || null,
- eventDate: date,
- artist: setlistArtistTransformer(raw?.artist),
- venue: setlistVenueTransformer(raw?.venue),
- tour: raw?.tour?.name || null,
- sets: setlistSetsTransformer(raw?.sets?.set),
- url: null,
- } as Setlist;
-}
-
-function setlistArtistTransformer(artist: any): SetlistFmArtist {
- return {
- name: artist?.name || artist?.sortName || '',
- mbid: artist?.mbid || null,
- url: artist?.url || '',
- } as SetlistFmArtist;
-}
-
-function setlistSetsTransformer(sets: any[]): MusicalSet[] {
- const listOfSets: MusicalSet[] = [];
- let counter = 1;
- for (const set of sets) {
- const newSet = {
- name: set.name || `Set #${counter}`,
- songs: setlistSongsTransformer(set.song),
- } as MusicalSet;
- counter = counter++;
- listOfSets.push(newSet);
- }
- return listOfSets;
-}
-
-function setlistVenueTransformer(venue: any): Venue {
- const city = venue?.city;
- return {
- id: venue?.id,
- name: venue?.name || '',
- city: city?.name || null,
- state: city?.state || null,
- country: city?.country?.name || null,
- } as Venue;
-}
-
-function setlistSongsTransformer(songs: any[]): SetTrack[] {
- const listOfSongs: SetTrack[] = [];
- for (const song of songs) {
- const songTitle = song.name;
- const tape = song.tape ?? false;
- let setTrack = { name: songTitle, tape } as SetTrack;
- if ('cover' in song) {
- setTrack = {
- name: songTitle,
- tape,
- originalArtist: {
- name: song.cover.name,
- mbid: song.cover.mbid,
- url: song.cover.url,
- } as SetlistFmArtist,
- } as SetTrack;
- }
- listOfSongs.push(setTrack);
- }
- return listOfSongs;
-}
diff --git a/src/utils/clients/setlistfm/transformers/setlist.transformer.ts b/src/utils/clients/setlistfm/transformers/setlist.transformer.ts
new file mode 100644
index 0000000..d469df1
--- /dev/null
+++ b/src/utils/clients/setlistfm/transformers/setlist.transformer.ts
@@ -0,0 +1,44 @@
+import { parse } from 'date-fns';
+import shortid from 'shortid';
+import { setlistVenueTransformer } from './venue.transformer';
+
+import type { Setlist } from 'utils/types/setlist';
+import type { Track } from 'utils/types/track';
+
+export function setlistTransformer(raw: any, withTracks: boolean): Setlist {
+ const artist = raw?.artist?.name ?? 'Unknown';
+
+ return {
+ id: raw.id,
+ // ToDo: try to do something about the unknown time (use a default? fetch it from elsewhere?)
+ date: parse(raw.eventDate, 'dd-MM-yyyy', new Date()),
+ artist,
+ tour: raw.tour?.name || '',
+ venue: setlistVenueTransformer(raw?.venue),
+ tracks:
+ withTracks && Array.isArray(raw.sets?.set)
+ ? raw.sets.set.map(({ song: rawSet }: any) => setlistTracklistTransformer(rawSet || [], artist)).flat()
+ : undefined,
+ trackCount: Array.isArray(raw.sets?.set)
+ ? raw.sets.set.reduce((acc: number, { song: rawSet }: any) => acc + (rawSet?.length || 0), 0)
+ : 0,
+ url: raw.url || '',
+ };
+}
+
+function setlistTracklistTransformer(rawSet: any, artist: string): Track[] {
+ if (!Array.isArray(rawSet)) return [];
+ return (
+ rawSet
+ .filter(({ tape }) => Boolean(tape))
+ .map((song, i) => ({
+ id: shortid.generate(),
+ trackNumber: i + 1,
+ artist,
+ title: song.name,
+ album: '',
+ albumArtist: '',
+ duration: 0,
+ })) || []
+ );
+}
diff --git a/src/utils/clients/setlistfm/transformers/setlistSearch.transformer.ts b/src/utils/clients/setlistfm/transformers/setlistSearch.transformer.ts
new file mode 100644
index 0000000..8000ba7
--- /dev/null
+++ b/src/utils/clients/setlistfm/transformers/setlistSearch.transformer.ts
@@ -0,0 +1,13 @@
+import { setlistTransformer } from './setlist.transformer';
+
+import type { Setlist } from 'utils/types/setlist';
+
+export function setlistSearchTransformer(raw: any) {
+ const results = raw?.setlist?.map(setlistTransformer);
+
+ return {
+ page: raw.page ? parseInt(raw.page) : 1,
+ totalPages: raw.total ? Math.ceil(parseInt(raw.total) / parseInt(raw.itemsPerPage)) : 1,
+ results: results ?? ([] as Setlist[]),
+ };
+}
diff --git a/src/utils/clients/setlistfm/transformers/venue.transformer.ts b/src/utils/clients/setlistfm/transformers/venue.transformer.ts
new file mode 100644
index 0000000..d07cbb9
--- /dev/null
+++ b/src/utils/clients/setlistfm/transformers/venue.transformer.ts
@@ -0,0 +1,11 @@
+import type { SetlistVenue } from 'utils/types/setlist';
+
+export function setlistVenueTransformer(venue: any): SetlistVenue {
+ const city = venue?.city;
+ return {
+ name: venue.name || '',
+ city: city.name || '',
+ state: city.state || '',
+ country: city?.country?.name || '',
+ };
+}
diff --git a/src/utils/types/artist.d.ts b/src/utils/types/artist.d.ts
index 20f1047..faa207b 100644
--- a/src/utils/types/artist.d.ts
+++ b/src/utils/types/artist.d.ts
@@ -14,8 +14,4 @@ export type DiscogsArtist = BaseArtist & {
discogsId: string;
};
-export type SetlistFmArtist = BaseArtist & {
- mbid: string;
-};
-
-export type Artist = LastFmArtist | DiscogsArtist | SetlistFmArtist;
+export type Artist = LastFmArtist | DiscogsArtist;
diff --git a/src/utils/types/setlist.d.ts b/src/utils/types/setlist.d.ts
index 8635cf0..98e4720 100644
--- a/src/utils/types/setlist.d.ts
+++ b/src/utils/types/setlist.d.ts
@@ -1,36 +1,17 @@
-import { SetlistFmArtist } from 'utils/types/artist';
-
-type Song = {
- name: string;
- tape: boolean;
-};
-
-type Cover = Song & {
- originalArtist: SetlistFmArtist;
-};
-
-type SetTrack = Song | Cover;
-
-type MusicalSet = {
- name: string;
- songs: SetTrack[];
-};
-
-type Venue = {
- id: string;
+type SetlistVenue = {
name: string;
city: string;
- state: string;
+ state?: string;
country: string;
};
export type Setlist = {
id: string;
- versionId: string;
- eventDate: Date;
- artist: SetlistFmArtist;
+ date: Date;
+ artist: string;
tour: string;
- venue: Venue;
- sets: MusicalSet[];
+ venue: SetlistVenue;
+ trackCount: number;
+ tracks?: MusicalSet[];
url: string;
};