@@ -269,6 +269,54 @@ <h1>Spotify Import</h1>
269269 return values ;
270270 }
271271
272+ function normalizeCsvHeader ( header ) {
273+ return String ( header || "" )
274+ . trim ( )
275+ . toLowerCase ( )
276+ . replace ( / ^ \uFEFF / , "" )
277+ . replace ( / \( [ ^ ) ] * \) / g, "" )
278+ . replace ( / [ ^ a - z 0 - 9 ] + / g, " " )
279+ . trim ( ) ;
280+ }
281+
282+ function findHeaderIndex ( headers , aliases ) {
283+ const normalizedHeaders = headers . map ( normalizeCsvHeader ) ;
284+ for ( const alias of aliases ) {
285+ const index = normalizedHeaders . indexOf ( normalizeCsvHeader ( alias ) ) ;
286+ if ( index !== - 1 ) return index ;
287+ }
288+ return - 1 ;
289+ }
290+
291+ const csvHeaderAliases = {
292+ trackName : [
293+ "Track Name" ,
294+ "Track" ,
295+ "Track Title" ,
296+ "Title" ,
297+ "Song" ,
298+ "Song Name" ,
299+ "Name" ,
300+ ] ,
301+ artistName : [
302+ "Artist Name(s)" ,
303+ "Artist Name" ,
304+ "Artist" ,
305+ "Artists" ,
306+ "Artist(s)" ,
307+ "Artist Names" ,
308+ "Track Artist" ,
309+ ] ,
310+ albumName : [
311+ "Album Name" ,
312+ "Album" ,
313+ "Release" ,
314+ "Release Name" ,
315+ "Record" ,
316+ "Collection" ,
317+ ] ,
318+ } ;
319+
272320 function csvToPlaylistJson ( csvText , filename ) {
273321 const rows = csvText
274322 . split ( / \r ? \n / )
@@ -280,17 +328,13 @@ <h1>Spotify Import</h1>
280328 }
281329
282330 const headers = parseCsvLine ( rows [ 0 ] ) ;
283- const trackNameIndex = headers . indexOf ( "Track Name" ) ;
284- const albumNameIndex = headers . indexOf ( "Album Name" ) ;
285- const artistNameIndex = headers . indexOf ( "Artist Name(s)" ) ;
286-
287- if (
288- trackNameIndex === - 1 ||
289- albumNameIndex === - 1 ||
290- artistNameIndex === - 1
291- ) {
331+ const trackNameIndex = findHeaderIndex ( headers , csvHeaderAliases . trackName ) ;
332+ const albumNameIndex = findHeaderIndex ( headers , csvHeaderAliases . albumName ) ;
333+ const artistNameIndex = findHeaderIndex ( headers , csvHeaderAliases . artistName ) ;
334+
335+ if ( trackNameIndex === - 1 || artistNameIndex === - 1 ) {
292336 throw new Error (
293- "CSV is missing required columns: Track Name, Album Name, Artist Name(s) ." ,
337+ "CSV is missing required columns. Aurral needs a track/title column and an artist column ." ,
294338 ) ;
295339 }
296340
@@ -300,7 +344,7 @@ <h1>Spotify Import</h1>
300344 const cols = parseCsvLine ( row ) ;
301345 return {
302346 artistName : cols [ artistNameIndex ] || "" ,
303- albumName : cols [ albumNameIndex ] || "" ,
347+ albumName : albumNameIndex === - 1 ? "" : cols [ albumNameIndex ] || "" ,
304348 trackName : cols [ trackNameIndex ] || "" ,
305349 } ;
306350 } )
0 commit comments