import { utcToZonedTime } from "date-fns-tz"; import setHours from "date-fns/setHours"; import xl from "excel4node"; class Export { /** * Méthode permettant de remplacer certains cartactères par leur équivalents html * @param {String} str * * @return {String} */ static replaceSpecialChars(str) { if (!str) { return ""; } let final = str.toString(); const find = ["&", "<", ">"]; const replace = ["&", "<", ">"]; for (let i = 0; i < find.length; i += 1) { final = final.replace(new RegExp(find[i], "g"), replace[i]); } return final; } /** * Méthode permettant de convertir les rows en csv * @param {Array} rows * * @return {string} */ static async convertToCsv(rows) { let data = "Artiste;Titre;Genre;Styles;Pays;Année;Date de sortie;Format\n\r"; for (let i = 0; i < rows.length; i += 1) { const { artists_sort, title, genres, styles, country, year, released, formats, } = rows[i]; let format = ""; for (let j = 0; j < formats.length; j += 1) { format += `${format !== "" ? ", " : ""}${formats[j].name}`; } data += `${artists_sort};${title};${genres.join()};${styles.join()};${country};${year};${released};${format}\n\r`; } return data; } /** * Méthode permettant de convertir les rows en fichier xls * @param {Array} rows * * @return {Object} */ static async convertToXls(rows) { const wb = new xl.Workbook(); const ws = wb.addWorksheet("MusicTopus"); const headerStyle = wb.createStyle({ font: { color: "#FFFFFF", size: 11, }, fill: { type: "pattern", patternType: "solid", bgColor: "#595959", fgColor: "#595959", }, }); const style = wb.createStyle({ font: { color: "#000000", size: 11, }, numberFormat: "0000", }); const header = [ "Artiste", "Titre", "Genre", "Styles", "Pays", "Année", "Date de sortie", "Format", ]; for (let i = 0; i < header.length; i += 1) { ws.cell(1, i + 1) .string(header[i]) .style(headerStyle); } for (let i = 0; i < rows.length; i += 1) { const currentRow = i + 2; const { artists_sort, title, genres, styles, country, year, released, formats, } = rows[i]; let format = ""; for (let j = 0; j < formats.length; j += 1) { format += `${format !== "" ? ", " : ""}${formats[j].name}`; } ws.cell(currentRow, 1).string(artists_sort).style(style); ws.cell(currentRow, 2).string(title).style(style); ws.cell(currentRow, 3).string(genres.join()).style(style); ws.cell(currentRow, 4).string(styles.join()).style(style); if (country) { ws.cell(currentRow, 5).string(country).style(style); } if (year) { ws.cell(currentRow, 6).number(year).style(style); } if (released) { ws.cell(currentRow, 7) .date( setHours(utcToZonedTime(released, "Europe/Paris"), 12) ) .style({ numberFormat: "dd/mm/yyyy" }); } ws.cell(currentRow, 8).string(format).style(style); } return wb; } /** * Méthode permettant de convertir les rows en csv pour importer dans MusicTopus * @param {Array} rows * * @return {string} */ static async convertToXml(rows) { let data = '\n\r'; for (let i = 0; i < rows.length; i += 1) { const { discogsId, year, released, uri, artists, artists_sort, labels, series, companies, formats, title, country, notes, identifiers, videos, genres, styles, tracklist, extraartists, images, thumb, } = rows[i]; let artistsList = ""; let labelList = ""; let serieList = ""; let companiesList = ""; let formatsList = ""; let identifiersList = ""; let videosList = ""; let genresList = ""; let stylesList = ""; let tracklistList = ""; let extraartistsList = ""; let imagesList = ""; for (let j = 0; j < artists.length; j += 1) { artistsList += ` ${Export.replaceSpecialChars(artists[j].name)} ${Export.replaceSpecialChars(artists[j].anv)} ${Export.replaceSpecialChars(artists[j].join)} ${Export.replaceSpecialChars(artists[j].role)} ${Export.replaceSpecialChars(artists[j].tracks)} ${Export.replaceSpecialChars(artists[j].id)} ${Export.replaceSpecialChars( artists[j].resource_url )} ${Export.replaceSpecialChars( artists[j].thumbnail_url )} `; } for (let j = 0; j < labels.length; j += 1) { labelList += ` `; } for (let j = 0; j < series.length; j += 1) { serieList += ` ${Export.replaceSpecialChars(series[j].name)} ${Export.replaceSpecialChars(series[j].catno)} ${Export.replaceSpecialChars( series[j].entity_type )} ${Export.replaceSpecialChars( series[j].entity_type_name )} ${Export.replaceSpecialChars(series[j].id)} ${Export.replaceSpecialChars( series[j].resource_url )} ${Export.replaceSpecialChars( series[j].thumbnail_url )} `; } for (let j = 0; j < companies.length; j += 1) { companiesList += ` ${Export.replaceSpecialChars(companies[j].name)} ${Export.replaceSpecialChars(companies[j].catno)} ${Export.replaceSpecialChars( companies[j].entity_type )} ${Export.replaceSpecialChars( companies[j].entity_type_name )} ${Export.replaceSpecialChars(companies[j].id)} ${Export.replaceSpecialChars( companies[j].resource_url )} ${Export.replaceSpecialChars( companies[j].thumbnail_url )} `; } for (let j = 0; j < formats.length; j += 1) { let descriptions = ""; if (formats[j].descriptions) { for ( let k = 0; k < formats[j].descriptions.length; k += 1 ) { descriptions += `${formats[j].descriptions[k]} `; } } formatsList += ` ${Export.replaceSpecialChars(formats[j].name)} ${Export.replaceSpecialChars(formats[j].qty)} ${Export.replaceSpecialChars(formats[j].text)} ${descriptions} `; } for (let j = 0; j < identifiers.length; j += 1) { identifiersList += ` ${Export.replaceSpecialChars(identifiers[j].type)} ${Export.replaceSpecialChars(identifiers[j].value)} ${Export.replaceSpecialChars( identifiers[j].description )} `; } for (let j = 0; j < videos.length; j += 1) { videosList += ` `; } for (let j = 0; j < genres.length; j += 1) { genresList += `${Export.replaceSpecialChars( genres[j] )} `; } for (let j = 0; j < styles.length; j += 1) { stylesList += ` `; } for (let j = 0; j < tracklist.length; j += 1) { tracklistList += ` ${Export.replaceSpecialChars(tracklist[j].title)} `; } for (let j = 0; j < extraartists.length; j += 1) { extraartistsList += ` ${Export.replaceSpecialChars(extraartists[j].name)} ${Export.replaceSpecialChars(extraartists[j].anv)} ${Export.replaceSpecialChars(extraartists[j].join)} ${Export.replaceSpecialChars(extraartists[j].role)} ${Export.replaceSpecialChars( extraartists[j].tracks )} ${Export.replaceSpecialChars(extraartists[j].id)} ${Export.replaceSpecialChars( extraartists[j].resource_url )} ${Export.replaceSpecialChars( extraartists[j].thumbnail_url )} `; } for (let j = 0; j < images.length; j += 1) { imagesList += ` ${Export.replaceSpecialChars(images[j].uri)} ${Export.replaceSpecialChars( images[j].resource_url )} ${Export.replaceSpecialChars( images[j].resource_url )} `; } data += ` ${discogsId} ${Export.replaceSpecialChars(title)} ${Export.replaceSpecialChars(artists_sort)} ${artistsList} ${year} ${Export.replaceSpecialChars(country)} ${released} ${uri} ${thumb} ${labelList} ${serieList} ${companiesList} ${formatsList} ${Export.replaceSpecialChars(notes)} ${identifiersList} ${videosList} ${genresList} ${stylesList} ${tracklistList} ${extraartistsList} ${imagesList} `; } return `${data}`; } /** * Méthode permettant de convertir les rows en csv pour importer dans MusicTopus * @param {Array} rows * * @return {string} */ static async convertToMusicTopus(rows) { let data = "itemId;createdAt;updatedAt\n\r"; for (let i = 0; i < rows.length; i += 1) { const { discogsId, createdAt, updatedAt } = rows[i]; data += `${discogsId};${createdAt};${updatedAt}\n\r`; } data += "v1.0"; return data; } } export default Export;