153 lines
5.6 KiB
JavaScript
153 lines
5.6 KiB
JavaScript
|
|
const fs = require("fs");
|
||
|
|
const path = require("path");
|
||
|
|
const csv = require("csv-parser");
|
||
|
|
const React = require("react");
|
||
|
|
const dotenv = require("dotenv");
|
||
|
|
const ReactDOMServer = require("react-dom/server");
|
||
|
|
const TemplatePageModule = require("./build/components/jamtracks/JKJamTracksLandingTemplatePage");
|
||
|
|
|
||
|
|
var csvFilePath = `jam_tracks_for_jam_ui.${process.env.USER}.csv`
|
||
|
|
|
||
|
|
const init = () => {
|
||
|
|
const node_env = process.env.NODE_ENV || 'development';
|
||
|
|
const environment = process.env.ENVIRONMENT || 'development';
|
||
|
|
console.log(`environment=${environment} node_env=${node_env}`);
|
||
|
|
console.log(dotenv.config({ path: `../.env.${environment}` }));
|
||
|
|
|
||
|
|
if (environment === "production" || environment === "staging") {
|
||
|
|
csvFilePath = `jam_tracks_for_jam_ui.${environment}.csv`;
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log("using csv file", csvFilePath);
|
||
|
|
|
||
|
|
if (!process.env.PUBLIC_URL) {
|
||
|
|
console.log("setting public url", process.env.REACT_APP_BASE_URL);
|
||
|
|
process.env.PUBLIC_URL = "";
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//const __dirname = path.resolve(path.dirname(''));
|
||
|
|
|
||
|
|
console.log("init done successfully")
|
||
|
|
}
|
||
|
|
|
||
|
|
const generatePages = async (render) => {
|
||
|
|
const rows = [];
|
||
|
|
|
||
|
|
const OUTPUT_DIR = path.join(__dirname, "..", "public", "backing-tracks");
|
||
|
|
|
||
|
|
if (!fs.existsSync(OUTPUT_DIR)) {
|
||
|
|
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log("generatPages starting")
|
||
|
|
|
||
|
|
|
||
|
|
const TemplatePage = TemplatePageModule.default;
|
||
|
|
|
||
|
|
fs.createReadStream(csvFilePath)
|
||
|
|
.pipe(csv())
|
||
|
|
.on("data", (row) => rows.push(row))
|
||
|
|
.on("end", async () => {
|
||
|
|
console.log(`Processing ${rows.length} rows...`);
|
||
|
|
|
||
|
|
for (const row of rows) {
|
||
|
|
// id, original_artist, name, original_artist_slug, name_slug, plan_code, slug, URL, licensor, vendor_id
|
||
|
|
const { id, original_artist, name, original_artist_slug, name_slug, plan_code, slug } = row;
|
||
|
|
const artist = original_artist;
|
||
|
|
const song = name;
|
||
|
|
const location = `/backing-tracks/${original_artist_slug}/${name_slug}`;
|
||
|
|
const fullPath = process.env.REACT_APP_BASE_URL + location;
|
||
|
|
const logoPath = process.env.REACT_APP_BASE_URL + "/favicon.svg";
|
||
|
|
|
||
|
|
console.log(`Generating ${artist} - ${song}`);
|
||
|
|
|
||
|
|
const html = render
|
||
|
|
? ReactDOMServer.renderToStaticMarkup(
|
||
|
|
React.createElement(TemplatePage, { id, plan_code, slug, artist, song, location })
|
||
|
|
)
|
||
|
|
: "";
|
||
|
|
const fullHtml = `<!DOCTYPE html>
|
||
|
|
<html lang="en">
|
||
|
|
<head>
|
||
|
|
<meta charset="UTF-8">
|
||
|
|
<link rel="shortcut icon" href="/favicon.svg">
|
||
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
|
<title>${artist} - ${song} - Free Backing Track</title>
|
||
|
|
<link rel="stylesheet" href="${process.env.REACT_APP_BASE_URL}/css/theme.css">
|
||
|
|
<meta name="description" content="Get free ${song} by ${artist} backing track, plus free tools to mute any part, slow down for practice, record yourself, more">
|
||
|
|
<meta name="keywords" content="Backing Track, ${artist}, ${song}, Instrumental">
|
||
|
|
<meta name="author" content="JamKazam">
|
||
|
|
|
||
|
|
<!-- Open Graph (Facebook, LinkedIn, etc.) -->
|
||
|
|
<meta property="og:title" content="${artist} - ${song} | Free Backing Track">
|
||
|
|
<meta property="og:description" content="Get free ${song} by ${artist} backing track, plus free tools to mute any part, slow down for practice, record yourself, more">
|
||
|
|
<meta property="og:image" content="${logoPath}">
|
||
|
|
<meta property="og:url" content="${fullPath}">
|
||
|
|
<meta property="og:type" content="music.song">
|
||
|
|
|
||
|
|
<!-- Twitter Cards -->
|
||
|
|
<meta name="twitter:card" content="summary_large_image">
|
||
|
|
<meta name="twitter:title" content="${artist} - ${song} | Free Backing Track">
|
||
|
|
<meta name="twitter:description" content="Get free ${song} by ${artist} backing track, plus free tools to mute any part, slow down for practice, record yourself, more">
|
||
|
|
<meta name="twitter:image" content="${logoPath}">
|
||
|
|
|
||
|
|
<!-- Canonical URL -->
|
||
|
|
<link rel="canonical" href="${fullPath}" />
|
||
|
|
|
||
|
|
<!-- Structured Data (Schema.org) -->
|
||
|
|
<script type="application/ld+json">
|
||
|
|
{
|
||
|
|
"@context": "https://schema.org",
|
||
|
|
"@type": "MusicRecording",
|
||
|
|
"name": "${song}",
|
||
|
|
"byArtist": {
|
||
|
|
"@type": "MusicGroup",
|
||
|
|
"name": "${artist}"
|
||
|
|
},
|
||
|
|
"url": "${fullPath}",
|
||
|
|
"image": "${logoPath}"
|
||
|
|
}
|
||
|
|
</script>
|
||
|
|
<script>
|
||
|
|
window.jamtrack_data = {
|
||
|
|
id: "${id}",
|
||
|
|
plan_code: "${plan_code}",
|
||
|
|
slug: "${slug}",
|
||
|
|
artist: "${artist}",
|
||
|
|
song: "${song}",
|
||
|
|
location: "${location}"
|
||
|
|
}
|
||
|
|
</script>
|
||
|
|
</head>
|
||
|
|
<body>
|
||
|
|
<div id="root">${html}</div>
|
||
|
|
<script src="/js/client-hydrate.bundle.js"></script>
|
||
|
|
</body>
|
||
|
|
</html>`;
|
||
|
|
|
||
|
|
const ARTIST_DIR = path.join(OUTPUT_DIR, original_artist_slug);
|
||
|
|
|
||
|
|
if (!fs.existsSync(ARTIST_DIR)) {
|
||
|
|
fs.mkdirSync(ARTIST_DIR, { recursive: false });
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log("process.env.NODE_ENV=", process.env.NODE_ENV);
|
||
|
|
const finalOutputPath = process.env.NODE_ENV === "development" ? `${name_slug}.html` : name_slug;
|
||
|
|
const outputFilePath = path.join(ARTIST_DIR, finalOutputPath);
|
||
|
|
fs.writeFileSync(outputFilePath, fullHtml);
|
||
|
|
console.log(`Generated: ${outputFilePath}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log("All pages generated!");
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
let render = false;
|
||
|
|
if (process.argv.length > 2) {
|
||
|
|
render = process.argv[2] === "true" || process.argv[2] === "yes" || process.argv[2] === "1";
|
||
|
|
}
|
||
|
|
|
||
|
|
init()
|
||
|
|
generatePages(render);
|