Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
a79ad12b69 |
12 changed files with 6540 additions and 5234 deletions
10714
package-lock.json
generated
10714
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,9 +1,5 @@
|
||||||
@import '../node_modules/knacss/sass/knacss.scss';
|
@import '../node_modules/knacss/sass/knacss.scss';
|
||||||
|
|
||||||
table {
|
|
||||||
table-layout: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SPÉCIFIQUE AU SITE
|
// SPÉCIFIQUE AU SITE
|
||||||
@import './fonts';
|
@import './fonts';
|
||||||
@import './colors';
|
@import './colors';
|
||||||
|
|
|
@ -1,456 +0,0 @@
|
||||||
import { utcToZonedTime } from "date-fns-tz";
|
|
||||||
import setHours from "date-fns/setHours";
|
|
||||||
import xl from "excel4node";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de formater une ligne
|
|
||||||
* @param {Object} raw
|
|
||||||
*
|
|
||||||
* @returns {Object}
|
|
||||||
*/
|
|
||||||
const formatRow = (raw) => {
|
|
||||||
const {
|
|
||||||
artists_sort,
|
|
||||||
title,
|
|
||||||
genres,
|
|
||||||
styles,
|
|
||||||
country,
|
|
||||||
year,
|
|
||||||
released,
|
|
||||||
formats,
|
|
||||||
} = raw;
|
|
||||||
|
|
||||||
let format = "";
|
|
||||||
for (let j = 0; j < formats.length; j += 1) {
|
|
||||||
format += `${format !== "" ? ", " : ""}${formats[j].name}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
artists_sort,
|
|
||||||
title,
|
|
||||||
genres: genres.join(", "),
|
|
||||||
styles: styles.join(", "),
|
|
||||||
country: country || "",
|
|
||||||
year: year || 0,
|
|
||||||
released: released
|
|
||||||
? setHours(utcToZonedTime(released, "Europe/Paris"), 12)
|
|
||||||
: 0,
|
|
||||||
format,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de remplacer certains cartactères par leur équivalents html
|
|
||||||
* @param {String} str
|
|
||||||
*
|
|
||||||
* @return {String}
|
|
||||||
*/
|
|
||||||
const 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de convertir les rows en csv
|
|
||||||
* @param {Array} rows
|
|
||||||
*
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
export const 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de convertir les rows en fichier xls
|
|
||||||
* @param {Array} rows
|
|
||||||
*
|
|
||||||
* @return {Object}
|
|
||||||
*/
|
|
||||||
export const 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,
|
|
||||||
format,
|
|
||||||
} = formatRow(rows[i]);
|
|
||||||
|
|
||||||
ws.cell(currentRow, 1).string(artists_sort).style(style);
|
|
||||||
ws.cell(currentRow, 2).string(title).style(style);
|
|
||||||
ws.cell(currentRow, 3).string(genres).style(style);
|
|
||||||
ws.cell(currentRow, 4).string(styles).style(style);
|
|
||||||
ws.cell(currentRow, 5).string(country).style(style);
|
|
||||||
ws.cell(currentRow, 6).number(year).style(style);
|
|
||||||
if (released) {
|
|
||||||
ws.cell(currentRow, 7)
|
|
||||||
.date(released)
|
|
||||||
.style({ numberFormat: "dd/mm/yyyy" });
|
|
||||||
}
|
|
||||||
ws.cell(currentRow, 8).string(format).style(style);
|
|
||||||
}
|
|
||||||
|
|
||||||
return wb;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fonction permettant de convertir les rows en csv pour importer dans MusicTopus
|
|
||||||
* @param {Array} rows
|
|
||||||
*
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
export const convertToXml = (rows) => {
|
|
||||||
let data = '<?xml version="1.0" encoding="UTF-8"?>\n\r<albums>';
|
|
||||||
|
|
||||||
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 += `<artist>
|
|
||||||
<name>${replaceSpecialChars(artists[j].name)}</name>
|
|
||||||
<anv>${replaceSpecialChars(artists[j].anv)}</anv>
|
|
||||||
<join>${replaceSpecialChars(artists[j].join)}</join>
|
|
||||||
<role>${replaceSpecialChars(artists[j].role)}</role>
|
|
||||||
<tracks>${replaceSpecialChars(artists[j].tracks)}</tracks>
|
|
||||||
<id>${replaceSpecialChars(artists[j].id)}</id>
|
|
||||||
<resource_url>${replaceSpecialChars(
|
|
||||||
artists[j].resource_url
|
|
||||||
)}</resource_url>
|
|
||||||
<thumbnail_url>${replaceSpecialChars(
|
|
||||||
artists[j].thumbnail_url
|
|
||||||
)}</thumbnail_url>
|
|
||||||
</artist>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < labels.length; j += 1) {
|
|
||||||
labelList += `<label>
|
|
||||||
<name>${replaceSpecialChars(labels[j].name)}</name>
|
|
||||||
<catno>${replaceSpecialChars(labels[j].catno)}</catno>
|
|
||||||
<entity_type>${replaceSpecialChars(labels[j].entity_type)}</entity_type>
|
|
||||||
<entity_type_name>${replaceSpecialChars(
|
|
||||||
labels[j].entity_type
|
|
||||||
)}</entity_type_name>
|
|
||||||
<id>${replaceSpecialChars(labels[j].id)}</id>
|
|
||||||
<resource_url>${replaceSpecialChars(
|
|
||||||
labels[j].resource_url
|
|
||||||
)}</resource_url>
|
|
||||||
<thumbnail_url>${replaceSpecialChars(
|
|
||||||
labels[j].thumbnail_url
|
|
||||||
)}</thumbnail_url>
|
|
||||||
</label>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < series.length; j += 1) {
|
|
||||||
serieList += `<serie>
|
|
||||||
<name>${replaceSpecialChars(series[j].name)}</name>
|
|
||||||
<catno>${replaceSpecialChars(series[j].catno)}</catno>
|
|
||||||
<entity_type>${replaceSpecialChars(series[j].entity_type)}</entity_type>
|
|
||||||
<entity_type_name>${replaceSpecialChars(
|
|
||||||
series[j].entity_type_name
|
|
||||||
)}</entity_type_name>
|
|
||||||
<id>${replaceSpecialChars(series[j].id)}</id>
|
|
||||||
<resource_url>${replaceSpecialChars(
|
|
||||||
series[j].resource_url
|
|
||||||
)}</resource_url>
|
|
||||||
<thumbnail_url>${replaceSpecialChars(
|
|
||||||
series[j].thumbnail_url
|
|
||||||
)}</thumbnail_url>
|
|
||||||
</serie>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < companies.length; j += 1) {
|
|
||||||
companiesList += `<company>
|
|
||||||
<name>${replaceSpecialChars(companies[j].name)}</name>
|
|
||||||
<catno>${replaceSpecialChars(companies[j].catno)}</catno>
|
|
||||||
<entity_type>${replaceSpecialChars(
|
|
||||||
companies[j].entity_type
|
|
||||||
)}</entity_type>
|
|
||||||
<entity_type_name>${replaceSpecialChars(
|
|
||||||
companies[j].entity_type_name
|
|
||||||
)}</entity_type_name>
|
|
||||||
<id>${replaceSpecialChars(companies[j].id)}</id>
|
|
||||||
<resource_url>${replaceSpecialChars(
|
|
||||||
companies[j].resource_url
|
|
||||||
)}</resource_url>
|
|
||||||
<thumbnail_url>${replaceSpecialChars(
|
|
||||||
companies[j].thumbnail_url
|
|
||||||
)}</thumbnail_url>
|
|
||||||
</company>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 += `<description>${formats[j].descriptions[k]}</description>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
formatsList += `<format>
|
|
||||||
<name>${replaceSpecialChars(formats[j].name)}</name>
|
|
||||||
<qte>${replaceSpecialChars(formats[j].qty)}</qte>
|
|
||||||
<text>${replaceSpecialChars(formats[j].text)}</text>
|
|
||||||
<descriptions>
|
|
||||||
${descriptions}
|
|
||||||
</descriptions>
|
|
||||||
</format>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < identifiers.length; j += 1) {
|
|
||||||
identifiersList += `<identifier>
|
|
||||||
<type>${replaceSpecialChars(identifiers[j].type)}</type>
|
|
||||||
<value>${replaceSpecialChars(identifiers[j].value)}</value>
|
|
||||||
<description>${replaceSpecialChars(
|
|
||||||
identifiers[j].description
|
|
||||||
)}</description>
|
|
||||||
</identifier>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < videos.length; j += 1) {
|
|
||||||
videosList += `<video embed="${videos[j].embed}">
|
|
||||||
<uri>${replaceSpecialChars(videos[j].uri)}</uri>
|
|
||||||
<title>${replaceSpecialChars(videos[j].title)}</title>
|
|
||||||
<description>${replaceSpecialChars(videos[j].description)}</description>
|
|
||||||
<duration>${replaceSpecialChars(videos[j].duration)}</duration>
|
|
||||||
</video>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < genres.length; j += 1) {
|
|
||||||
genresList += `<genre>${replaceSpecialChars(genres[j])}</genre>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < styles.length; j += 1) {
|
|
||||||
stylesList += `<style>${replaceSpecialChars(styles[j])}</style>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < tracklist.length; j += 1) {
|
|
||||||
tracklistList += `<tracklist position="${
|
|
||||||
tracklist[j].position
|
|
||||||
}" type="${tracklist[j].type_}" duration="${tracklist[j].duration}">
|
|
||||||
${replaceSpecialChars(tracklist[j].title)}
|
|
||||||
</tracklist>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < extraartists.length; j += 1) {
|
|
||||||
extraartistsList += `<extraartist>
|
|
||||||
<name>${replaceSpecialChars(extraartists[j].name)}</name>
|
|
||||||
<anv>${replaceSpecialChars(extraartists[j].anv)}</anv>
|
|
||||||
<join>${replaceSpecialChars(extraartists[j].join)}</join>
|
|
||||||
<role>${replaceSpecialChars(extraartists[j].role)}</role>
|
|
||||||
<tracks>${replaceSpecialChars(extraartists[j].tracks)}</tracks>
|
|
||||||
<id>${replaceSpecialChars(extraartists[j].id)}</id>
|
|
||||||
<resource_url>${replaceSpecialChars(
|
|
||||||
extraartists[j].resource_url
|
|
||||||
)}</resource_url>
|
|
||||||
<thumbnail_url>${replaceSpecialChars(
|
|
||||||
extraartists[j].thumbnail_url
|
|
||||||
)}</thumbnail_url>
|
|
||||||
</extraartist>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j = 0; j < images.length; j += 1) {
|
|
||||||
imagesList += `<image type="${images[j].type}" width="${
|
|
||||||
images[j].width
|
|
||||||
}" height="${images[j].height}">
|
|
||||||
<uri>${replaceSpecialChars(images[j].uri)}</uri>
|
|
||||||
<resource_url>${replaceSpecialChars(
|
|
||||||
images[j].resource_url
|
|
||||||
)}</resource_url>
|
|
||||||
<uri150>${replaceSpecialChars(images[j].resource_url)}</uri150>
|
|
||||||
</image>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
data += `
|
|
||||||
<album>
|
|
||||||
<discogId>${discogsId}</discogId>
|
|
||||||
<title>${replaceSpecialChars(title)}</title>
|
|
||||||
<artists_sort>${replaceSpecialChars(artists_sort)}</artists_sort>
|
|
||||||
<artists>
|
|
||||||
${artistsList}
|
|
||||||
</artists>
|
|
||||||
<year>${year}</year>
|
|
||||||
<country>${replaceSpecialChars(country)}</country>
|
|
||||||
<released>${released}</released>
|
|
||||||
<uri>${uri}</uri>
|
|
||||||
<thumb>${thumb}</thumb>
|
|
||||||
<labels>
|
|
||||||
${labelList}
|
|
||||||
</labels>
|
|
||||||
<series>
|
|
||||||
${serieList}
|
|
||||||
</series>
|
|
||||||
<companies>
|
|
||||||
${companiesList}
|
|
||||||
</companies>
|
|
||||||
<formats>
|
|
||||||
${formatsList}
|
|
||||||
</formats>
|
|
||||||
<notes>${replaceSpecialChars(notes)}</notes>
|
|
||||||
<identifiers>
|
|
||||||
${identifiersList}
|
|
||||||
</identifiers>
|
|
||||||
<videos>
|
|
||||||
${videosList}
|
|
||||||
</videos>
|
|
||||||
<genres>
|
|
||||||
${genresList}
|
|
||||||
</genres>
|
|
||||||
<styles>
|
|
||||||
${stylesList}
|
|
||||||
</styles>
|
|
||||||
<tracklist>
|
|
||||||
${tracklistList}
|
|
||||||
</tracklist>
|
|
||||||
<extraartists>
|
|
||||||
${extraartistsList}
|
|
||||||
</extraartists>
|
|
||||||
<images>
|
|
||||||
${imagesList}
|
|
||||||
</images>
|
|
||||||
</album>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return `${data}</albums>`;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Méthode permettant de convertir les rows en csv pour importer dans MusicTopus
|
|
||||||
* @param {Array} rows
|
|
||||||
*
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
export const 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;
|
|
||||||
};
|
|
|
@ -5,12 +5,7 @@ import Mastodon from "mastodon";
|
||||||
import { v4 } from "uuid";
|
import { v4 } from "uuid";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import Pages from "./Pages";
|
import Pages from "./Pages";
|
||||||
import {
|
import Export from "./Export";
|
||||||
convertToCsv,
|
|
||||||
convertToMusicTopus,
|
|
||||||
convertToXls,
|
|
||||||
convertToXml,
|
|
||||||
} from "../helpers/export";
|
|
||||||
|
|
||||||
import AlbumsModel from "../models/albums";
|
import AlbumsModel from "../models/albums";
|
||||||
import JobsModel from "../models/jobs";
|
import JobsModel from "../models/jobs";
|
||||||
|
@ -278,13 +273,13 @@ Publié automatiquement via #musictopus`;
|
||||||
|
|
||||||
switch (exportFormat) {
|
switch (exportFormat) {
|
||||||
case "csv":
|
case "csv":
|
||||||
return convertToCsv(rows);
|
return Export.convertToCsv(rows);
|
||||||
case "xls":
|
case "xls":
|
||||||
return convertToXls(rows);
|
return Export.convertToXls(rows);
|
||||||
case "xml":
|
case "xml":
|
||||||
return convertToXml(rows);
|
return Export.convertToXml(rows);
|
||||||
case "musictopus":
|
case "musictopus":
|
||||||
return convertToMusicTopus(rows);
|
return Export.convertToMusicTopus(rows);
|
||||||
case "json":
|
case "json":
|
||||||
default:
|
default:
|
||||||
return {
|
return {
|
||||||
|
|
456
src/middleware/Export.js
Normal file
456
src/middleware/Export.js
Normal file
|
@ -0,0 +1,456 @@
|
||||||
|
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 = '<?xml version="1.0" encoding="UTF-8"?>\n\r<albums>';
|
||||||
|
|
||||||
|
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 += `<artist>
|
||||||
|
<name>${Export.replaceSpecialChars(artists[j].name)}</name>
|
||||||
|
<anv>${Export.replaceSpecialChars(artists[j].anv)}</anv>
|
||||||
|
<join>${Export.replaceSpecialChars(artists[j].join)}</join>
|
||||||
|
<role>${Export.replaceSpecialChars(artists[j].role)}</role>
|
||||||
|
<tracks>${Export.replaceSpecialChars(artists[j].tracks)}</tracks>
|
||||||
|
<id>${Export.replaceSpecialChars(artists[j].id)}</id>
|
||||||
|
<resource_url>${Export.replaceSpecialChars(
|
||||||
|
artists[j].resource_url
|
||||||
|
)}</resource_url>
|
||||||
|
<thumbnail_url>${Export.replaceSpecialChars(
|
||||||
|
artists[j].thumbnail_url
|
||||||
|
)}</thumbnail_url>
|
||||||
|
</artist>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < labels.length; j += 1) {
|
||||||
|
labelList += `<label>
|
||||||
|
<name>${Export.replaceSpecialChars(labels[j].name)}</name>
|
||||||
|
<catno>${Export.replaceSpecialChars(labels[j].catno)}</catno>
|
||||||
|
<entity_type>${Export.replaceSpecialChars(
|
||||||
|
labels[j].entity_type
|
||||||
|
)}</entity_type>
|
||||||
|
<entity_type_name>${Export.replaceSpecialChars(
|
||||||
|
labels[j].entity_type
|
||||||
|
)}</entity_type_name>
|
||||||
|
<id>${Export.replaceSpecialChars(labels[j].id)}</id>
|
||||||
|
<resource_url>${Export.replaceSpecialChars(
|
||||||
|
labels[j].resource_url
|
||||||
|
)}</resource_url>
|
||||||
|
<thumbnail_url>${Export.replaceSpecialChars(
|
||||||
|
labels[j].thumbnail_url
|
||||||
|
)}</thumbnail_url>
|
||||||
|
</label>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < series.length; j += 1) {
|
||||||
|
serieList += `<serie>
|
||||||
|
<name>${Export.replaceSpecialChars(series[j].name)}</name>
|
||||||
|
<catno>${Export.replaceSpecialChars(series[j].catno)}</catno>
|
||||||
|
<entity_type>${Export.replaceSpecialChars(
|
||||||
|
series[j].entity_type
|
||||||
|
)}</entity_type>
|
||||||
|
<entity_type_name>${Export.replaceSpecialChars(
|
||||||
|
series[j].entity_type_name
|
||||||
|
)}</entity_type_name>
|
||||||
|
<id>${Export.replaceSpecialChars(series[j].id)}</id>
|
||||||
|
<resource_url>${Export.replaceSpecialChars(
|
||||||
|
series[j].resource_url
|
||||||
|
)}</resource_url>
|
||||||
|
<thumbnail_url>${Export.replaceSpecialChars(
|
||||||
|
series[j].thumbnail_url
|
||||||
|
)}</thumbnail_url>
|
||||||
|
</serie>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < companies.length; j += 1) {
|
||||||
|
companiesList += `<company>
|
||||||
|
<name>${Export.replaceSpecialChars(companies[j].name)}</name>
|
||||||
|
<catno>${Export.replaceSpecialChars(companies[j].catno)}</catno>
|
||||||
|
<entity_type>${Export.replaceSpecialChars(
|
||||||
|
companies[j].entity_type
|
||||||
|
)}</entity_type>
|
||||||
|
<entity_type_name>${Export.replaceSpecialChars(
|
||||||
|
companies[j].entity_type_name
|
||||||
|
)}</entity_type_name>
|
||||||
|
<id>${Export.replaceSpecialChars(companies[j].id)}</id>
|
||||||
|
<resource_url>${Export.replaceSpecialChars(
|
||||||
|
companies[j].resource_url
|
||||||
|
)}</resource_url>
|
||||||
|
<thumbnail_url>${Export.replaceSpecialChars(
|
||||||
|
companies[j].thumbnail_url
|
||||||
|
)}</thumbnail_url>
|
||||||
|
</company>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 += `<description>${formats[j].descriptions[k]}</description>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
formatsList += `<format>
|
||||||
|
<name>${Export.replaceSpecialChars(formats[j].name)}</name>
|
||||||
|
<qte>${Export.replaceSpecialChars(formats[j].qty)}</qte>
|
||||||
|
<text>${Export.replaceSpecialChars(formats[j].text)}</text>
|
||||||
|
<descriptions>
|
||||||
|
${descriptions}
|
||||||
|
</descriptions>
|
||||||
|
</format>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < identifiers.length; j += 1) {
|
||||||
|
identifiersList += `<identifier>
|
||||||
|
<type>${Export.replaceSpecialChars(identifiers[j].type)}</type>
|
||||||
|
<value>${Export.replaceSpecialChars(identifiers[j].value)}</value>
|
||||||
|
<description>${Export.replaceSpecialChars(
|
||||||
|
identifiers[j].description
|
||||||
|
)}</description>
|
||||||
|
</identifier>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < videos.length; j += 1) {
|
||||||
|
videosList += `<video embed="${videos[j].embed}">
|
||||||
|
<uri>${Export.replaceSpecialChars(videos[j].uri)}</uri>
|
||||||
|
<title>${Export.replaceSpecialChars(videos[j].title)}</title>
|
||||||
|
<description>${Export.replaceSpecialChars(
|
||||||
|
videos[j].description
|
||||||
|
)}</description>
|
||||||
|
<duration>${Export.replaceSpecialChars(
|
||||||
|
videos[j].duration
|
||||||
|
)}</duration>
|
||||||
|
</video>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < genres.length; j += 1) {
|
||||||
|
genresList += `<genre>${Export.replaceSpecialChars(
|
||||||
|
genres[j]
|
||||||
|
)}</genre>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < styles.length; j += 1) {
|
||||||
|
stylesList += `<style>${Export.replaceSpecialChars(
|
||||||
|
styles[j]
|
||||||
|
)}</style>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < tracklist.length; j += 1) {
|
||||||
|
tracklistList += `<tracklist position="${
|
||||||
|
tracklist[j].position
|
||||||
|
}" type="${tracklist[j].type_}" duration="${
|
||||||
|
tracklist[j].duration
|
||||||
|
}">
|
||||||
|
${Export.replaceSpecialChars(tracklist[j].title)}
|
||||||
|
</tracklist>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < extraartists.length; j += 1) {
|
||||||
|
extraartistsList += `<extraartist>
|
||||||
|
<name>${Export.replaceSpecialChars(extraartists[j].name)}</name>
|
||||||
|
<anv>${Export.replaceSpecialChars(extraartists[j].anv)}</anv>
|
||||||
|
<join>${Export.replaceSpecialChars(extraartists[j].join)}</join>
|
||||||
|
<role>${Export.replaceSpecialChars(extraartists[j].role)}</role>
|
||||||
|
<tracks>${Export.replaceSpecialChars(
|
||||||
|
extraartists[j].tracks
|
||||||
|
)}</tracks>
|
||||||
|
<id>${Export.replaceSpecialChars(extraartists[j].id)}</id>
|
||||||
|
<resource_url>${Export.replaceSpecialChars(
|
||||||
|
extraartists[j].resource_url
|
||||||
|
)}</resource_url>
|
||||||
|
<thumbnail_url>${Export.replaceSpecialChars(
|
||||||
|
extraartists[j].thumbnail_url
|
||||||
|
)}</thumbnail_url>
|
||||||
|
</extraartist>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let j = 0; j < images.length; j += 1) {
|
||||||
|
imagesList += `<image type="${images[j].type}" width="${
|
||||||
|
images[j].width
|
||||||
|
}" height="${images[j].height}">
|
||||||
|
<uri>${Export.replaceSpecialChars(images[j].uri)}</uri>
|
||||||
|
<resource_url>${Export.replaceSpecialChars(
|
||||||
|
images[j].resource_url
|
||||||
|
)}</resource_url>
|
||||||
|
<uri150>${Export.replaceSpecialChars(
|
||||||
|
images[j].resource_url
|
||||||
|
)}</uri150>
|
||||||
|
</image>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
data += `
|
||||||
|
<album>
|
||||||
|
<discogId>${discogsId}</discogId>
|
||||||
|
<title>${Export.replaceSpecialChars(title)}</title>
|
||||||
|
<artists_sort>${Export.replaceSpecialChars(artists_sort)}</artists_sort>
|
||||||
|
<artists>
|
||||||
|
${artistsList}
|
||||||
|
</artists>
|
||||||
|
<year>${year}</year>
|
||||||
|
<country>${Export.replaceSpecialChars(country)}</country>
|
||||||
|
<released>${released}</released>
|
||||||
|
<uri>${uri}</uri>
|
||||||
|
<thumb>${thumb}</thumb>
|
||||||
|
<labels>
|
||||||
|
${labelList}
|
||||||
|
</labels>
|
||||||
|
<series>
|
||||||
|
${serieList}
|
||||||
|
</series>
|
||||||
|
<companies>
|
||||||
|
${companiesList}
|
||||||
|
</companies>
|
||||||
|
<formats>
|
||||||
|
${formatsList}
|
||||||
|
</formats>
|
||||||
|
<notes>${Export.replaceSpecialChars(notes)}</notes>
|
||||||
|
<identifiers>
|
||||||
|
${identifiersList}
|
||||||
|
</identifiers>
|
||||||
|
<videos>
|
||||||
|
${videosList}
|
||||||
|
</videos>
|
||||||
|
<genres>
|
||||||
|
${genresList}
|
||||||
|
</genres>
|
||||||
|
<styles>
|
||||||
|
${stylesList}
|
||||||
|
</styles>
|
||||||
|
<tracklist>
|
||||||
|
${tracklistList}
|
||||||
|
</tracklist>
|
||||||
|
<extraartists>
|
||||||
|
${extraartistsList}
|
||||||
|
</extraartists>
|
||||||
|
<images>
|
||||||
|
${imagesList}
|
||||||
|
</images>
|
||||||
|
</album>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${data}</albums>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
|
@ -5,12 +5,7 @@ import Mastodon from "mastodon";
|
||||||
import { v4 } from "uuid";
|
import { v4 } from "uuid";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import Pages from "./Pages";
|
import Pages from "./Pages";
|
||||||
import {
|
import Export from "./Export";
|
||||||
convertToCsv,
|
|
||||||
convertToMusicTopus,
|
|
||||||
convertToXls,
|
|
||||||
convertToXml,
|
|
||||||
} from "../helpers/export";
|
|
||||||
|
|
||||||
import WantListModel from "../models/wantlist";
|
import WantListModel from "../models/wantlist";
|
||||||
import JobsModel from "../models/jobs";
|
import JobsModel from "../models/jobs";
|
||||||
|
@ -279,13 +274,13 @@ Publié automatiquement via #musictopus`;
|
||||||
|
|
||||||
switch (exportFormat) {
|
switch (exportFormat) {
|
||||||
case "csv":
|
case "csv":
|
||||||
return convertToCsv(rows);
|
return Export.convertToCsv(rows);
|
||||||
case "xls":
|
case "xls":
|
||||||
return convertToXls(rows);
|
return Export.convertToXls(rows);
|
||||||
case "xml":
|
case "xml":
|
||||||
return convertToXml(rows);
|
return Export.convertToXml(rows);
|
||||||
case "musictopus":
|
case "musictopus":
|
||||||
return convertToMusicTopus(rows);
|
return Export.convertToMusicTopus(rows);
|
||||||
case "json":
|
case "json":
|
||||||
default:
|
default:
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -26,7 +26,7 @@ router
|
||||||
res.attachment("export-musictopus.xml");
|
res.attachment("export-musictopus.xml");
|
||||||
return res.status(200).send(data);
|
return res.status(200).send(data);
|
||||||
case "xls":
|
case "xls":
|
||||||
return data.write("musictopus.xlsx", res);
|
return data.write("musictopus.xls", res);
|
||||||
case "json":
|
case "json":
|
||||||
default:
|
default:
|
||||||
return sendResponse(req, res, data);
|
return sendResponse(req, res, data);
|
||||||
|
|
|
@ -26,7 +26,7 @@ router
|
||||||
res.attachment("export-musictopus.xml");
|
res.attachment("export-musictopus.xml");
|
||||||
return res.status(200).send(data);
|
return res.status(200).send(data);
|
||||||
case "xls":
|
case "xls":
|
||||||
return data.write("musictopus.xlsx", res);
|
return data.write("musictopus.xls", res);
|
||||||
case "json":
|
case "json":
|
||||||
default:
|
default:
|
||||||
return sendResponse(req, res, data);
|
return sendResponse(req, res, data);
|
||||||
|
|
|
@ -57,7 +57,7 @@ router
|
||||||
}
|
}
|
||||||
return res.redirect(url);
|
return res.redirect(url);
|
||||||
}
|
}
|
||||||
return res.redirect("/ma-collection");
|
return res.redirect("/");
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ if (registrationOpen) {
|
||||||
try {
|
try {
|
||||||
await Auth.register(req);
|
await Auth.register(req);
|
||||||
|
|
||||||
res.redirect("/ajouter-un-album");
|
res.redirect("/");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
res.redirect("/inscription");
|
res.redirect("/inscription");
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,10 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p class="text-justify">
|
<p class="text-justify">
|
||||||
Retrouvez votre cd-thèque partout depuis votre PC ou votre smartphone.
|
Retrouvez votre cd-thèque partout depuis votre ordinateur ou votre smartphone.
|
||||||
</p>
|
</p>
|
||||||
<p class="text-justify">
|
<p class="text-justify">
|
||||||
<strong>MusicTopus</strong> est une application Web (que vous pouvez auto-héberger) et un site Web (sur lequel vous pouvez créer un compte), permettant de gérer votre liste des CDs et Vinyles, et de l'utiliser facilement et n'importe où.
|
<strong>MusicTopus</strong> est une application Web (que vous pouvez auto-héberger) et un site Web (sur lequel vous pouvez créer un compte) permettant de répertorier votre collection de musique et d'y accéder facilement depuis n'importe où.
|
||||||
<br />
|
<br />
|
||||||
Le code source est publié sous licence libre <a href="https://www.gnu.org/licenses/gpl-3.0-standalone.html" target="_blank" rel="noopener noreferrer">GNU GPL-3.0-or-later <i class="icon-link"></i></a>. Le code source est disponible sur <a href="https://forge.darkou.fr/contact/MusicTopus" target="_blank">forge.darkou.fr <i class="icon-link"></i></a>.
|
Le code source est publié sous licence libre <a href="https://www.gnu.org/licenses/gpl-3.0-standalone.html" target="_blank" rel="noopener noreferrer">GNU GPL-3.0-or-later <i class="icon-link"></i></a>. Le code source est disponible sur <a href="https://forge.darkou.fr/contact/MusicTopus" target="_blank">forge.darkou.fr <i class="icon-link"></i></a>.
|
||||||
</p>
|
</p>
|
||||||
|
@ -20,9 +20,9 @@
|
||||||
Pourquoi utiliser MusicTopus ?
|
Pourquoi utiliser MusicTopus ?
|
||||||
</h2>
|
</h2>
|
||||||
<p class="text-justify">
|
<p class="text-justify">
|
||||||
<strong>MusicTopus</strong> est indispensable lorsqu'une collection, de CD-audios et vinyles, est devenue trop importante pour qu'on puisse se souvenir de tous les albums qu'elle contient. Consulter MusicTopus peut par exemple éviter un achat en double, et de savoir qu'on a des albums à céder ou échanger.
|
<strong>MusicTopus</strong> est indispensable lorsqu'une collection de CD's audio et vinyles (mais pas que !) est devenue trop importante pour que l'on puisse se souvenir de tous les albums qu'elle contient. Consulter MusicTopus peut par exemple éviter un achat en double ou permettre de savoir qu'on a des albums à céder ou à échanger.
|
||||||
<br />
|
<br />
|
||||||
Il existe déjà plusieurs applications de gestion de librairies musicales mais, (au moment de l'édition de cette présentation) aucune facilement accessible via internet, par exemple lorsqu'on est chez un disquaire.
|
Il existe déjà plusieurs applications de gestion de librairies musicales mais, au moment de l'écriture de cette présentation, aucune facilement accessible via internet, par exemple lorsqu'on se trouve chez un disquaire.
|
||||||
</p>
|
</p>
|
||||||
<h2>
|
<h2>
|
||||||
Qu'est ce qui fait tourner MusicTopus ?
|
Qu'est ce qui fait tourner MusicTopus ?
|
||||||
|
|
|
@ -5,12 +5,7 @@
|
||||||
<h1>Exporter ma liste de souhaits</h1>
|
<h1>Exporter ma liste de souhaits</h1>
|
||||||
<% } %>
|
<% } %>
|
||||||
<p>
|
<p>
|
||||||
Il est possible d'exporter votre collection dans plusieurs formats, que ce soit pour avoir un fichier sur votre pc ou tout simplement pour transférer votre collection sur un autre site disposant de MusicTopus.
|
Les formats CSV et Excel sont facilement lisiblent par un humain. Dans ces 2 formats vous trouverez seulement les informations principales de vos albums, à savoir :
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Les formats <a href="https://fr.wikipedia.org/wiki/Comma-separated_values" target="_blank" rel="noopener noreferrer">CSV<sup><i class="icon-link"></i></sup></a> et <a href="https://fr.wikipedia.org/wiki/XLSX" target="_blank" rel="noopener noreferrer">Excel<sup><i class="icon-link"></i></sup></a> sont facilement lisibles par un humain.
|
|
||||||
<br />
|
|
||||||
Dans ces 2 formats vous trouverez seulement les informations principales de vos albums, à savoir :
|
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Nom de l'artiste</li>
|
<li>Nom de l'artiste</li>
|
||||||
|
@ -28,9 +23,6 @@
|
||||||
<p>
|
<p>
|
||||||
Enfin le dernier format, MusicTopus, vous permettra d'exporter votre collection afin de l'importer ensuite sur une autre instance MusicTopus.
|
Enfin le dernier format, MusicTopus, vous permettra d'exporter votre collection afin de l'importer ensuite sur une autre instance MusicTopus.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
|
||||||
C'est maintenant à vous de jouer ! 😉
|
|
||||||
</p>
|
|
||||||
<form @submit="exportCollection">
|
<form @submit="exportCollection">
|
||||||
<strong>Choisir le format d'export</strong>
|
<strong>Choisir le format d'export</strong>
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,17 @@
|
||||||
<!-- <main class="layout-maxed ma-collection-details" id="ma-collection-statistiques"> -->
|
<main class="layout-maxed ma-collection-details" id="ma-collection-statistiques">
|
||||||
<main class="layout-maxed collection" id="mon-compte">
|
|
||||||
<h1>
|
<h1>
|
||||||
Mes statistiques
|
Mes statistiques
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10 mb-10">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-10 mb-10">
|
||||||
<div class="md:col-span-2 lg:col-span-3 box">
|
<div class="md:col-span-2 box">
|
||||||
<h2>Mon top 10</h2>
|
<h2>Mon top 10</h2>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th style="width: 60px;"></th>
|
||||||
<th>Artiste</th>
|
<th>Artiste</th>
|
||||||
<th>Albums</th>
|
<th style="width: 100px;">Albums</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -42,41 +41,28 @@
|
||||||
<canvas id="byFormats"></canvas>
|
<canvas id="byFormats"></canvas>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="box col-span-full">
|
<div><!-- histoire de faire un break --></div>
|
||||||
|
|
||||||
|
<div class="box">
|
||||||
<h2><%= page.currentYear.year %> (<%= page.currentYear.total %> ajout<%= page.currentYear.total > 1 ? 's' : '' %>)</h2>
|
<h2><%= page.currentYear.year %> (<%= page.currentYear.total %> ajout<%= page.currentYear.total > 1 ? 's' : '' %>)</h2>
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
|
|
||||||
<div>
|
|
||||||
<h3>Genres</h3>
|
<h3>Genres</h3>
|
||||||
<canvas id="currentYearGenres"></canvas>
|
<canvas id="currentYearGenres"></canvas>
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3>Styles</h3>
|
<h3>Styles</h3>
|
||||||
<canvas id="currentYearStyles"></canvas>
|
<canvas id="currentYearStyles"></canvas>
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3>Formats</h3>
|
<h3>Formats</h3>
|
||||||
<canvas id="currentYearFormats"></canvas>
|
<canvas id="currentYearFormats"></canvas>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
<div class="box">
|
||||||
<div class="box col-span-full">
|
|
||||||
<h2><%= page.lastYear.year %> (<%= page.lastYear.total %> ajout<%= page.lastYear.total > 1 ? 's' : '' %>)</h2>
|
<h2><%= page.lastYear.year %> (<%= page.lastYear.total %> ajout<%= page.lastYear.total > 1 ? 's' : '' %>)</h2>
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
|
|
||||||
<div>
|
|
||||||
<h3>Genres</h3>
|
<h3>Genres</h3>
|
||||||
<canvas id="lastYearGenres"></canvas>
|
<canvas id="lastYearGenres"></canvas>
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3>Styles</h3>
|
<h3>Styles</h3>
|
||||||
<canvas id="lastYearStyles"></canvas>
|
<canvas id="lastYearStyles"></canvas>
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3>Formats</h3>
|
<h3>Formats</h3>
|
||||||
<canvas id="lastYearFormats"></canvas>
|
<canvas id="lastYearFormats"></canvas>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue