Skip to content

Commit a1ee97d

Browse files
authored
Merge pull request #393 from lklynet/feature/flex-csv-headers
Accept flexible CSV header aliases
2 parents 2dde71a + 48260dd commit a1ee97d

1 file changed

Lines changed: 55 additions & 11 deletions

File tree

web/aurral-convert.html

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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-z0-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

Comments
 (0)