diff --git a/admin/app/admin/affiliates.rb b/admin/app/admin/affiliates.rb
index 59bf36114..8bfc083bb 100644
--- a/admin/app/admin/affiliates.rb
+++ b/admin/app/admin/affiliates.rb
@@ -15,9 +15,11 @@ ActiveAdmin.register JamRuby::AffiliatePartner, :as => 'Affiliates' do
#filter :partner_user
filter :partner_name
filter :id
+ filter :current_quarter_in_cents
+ filter :cumulative_earnings_in_cents
filter :jamtracks_sold
filter :subscriptions_count
- filter :current_quarter_in_cents
+ filter :referral_user_count
scope("Sorted By Current Quarter", default: true) { |scope| scope.where('partner_user_id IS NOT NULL').order('current_quarter_in_cents desc') }
scope("Sorted By Jamtracks Sold", default: false) { |scope| scope.where('partner_user_id IS NOT NULL').order('jamtracks_sold desc') }
diff --git a/jam-ui/cicd/generate.js b/jam-ui/cicd/generate.js
index a8d21eef3..de14dffb0 100644
--- a/jam-ui/cicd/generate.js
+++ b/jam-ui/cicd/generate.js
@@ -10,6 +10,49 @@ const ArtistTemplatePageModule = require("./build/components/jamtracks/JKJamTrac
var csvFilePath = `jamtracks-for-env/jam_tracks_for_jam_ui.${process.env.USER}.csv`
var artistCsvFilePath = `jamtracks-for-env/jam_tracks_for_jam_ui_artists.${process.env.USER}.csv`
+var sitemapPath = path.join(__dirname, ".", "build", "sitemap.xml");
+const clear_sitemap = () => {
+ fs.writeFileSync(sitemapPath, "");
+
+ // Add the root element
+ fs.writeFileSync(sitemapPath, `\n`, { flag: 'a' });
+
+ // Add the root url
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}\n`, { flag: 'a' });
+
+ // Add standard URLs specific to this site, such as:
+ // All prefix with /public
+
+
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/\n`, { flag: 'a' });
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/privacy\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/help\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/knowledge-base\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/help-desk\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/forum\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/unsubscribe\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/downloads\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/public/downloads-legacy\n`, { flag: 'a' } );
+
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/auth/login\n`, { flag: 'a' });
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/auth/register\n`, { flag: 'a' } );
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/auth/forget-password\n`, { flag: 'a' } );
+
+ // Add the closing root element
+}
+
+const add_song_to_sitemap = (artistSlug, songSlug) => {
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/backing-tracks/${artistSlug}/${songSlug}\n`, { flag: 'a' });
+}
+
+const add_artist_to_sitemap = (artistSlug) => {
+ fs.writeFileSync(sitemapPath, `${process.env.REACT_APP_BASE_URL}/backing-tracks/${artistSlug}\n`, { flag: 'a' });
+}
+
+const close_sitemap = () => {
+ fs.writeFileSync(sitemapPath, "", { flag: 'a' } );
+}
+
/**
* Loads a CSV file into an array of objects.
* @param {string} csvPath - The path to the CSV file.
@@ -59,6 +102,8 @@ const init = () => {
process.env.PUBLIC_URL = process.env.REACT_APP_BASE_URL;
}
+ clear_sitemap();
+
//const __dirname = path.resolve(path.dirname(''));
@@ -94,6 +139,8 @@ const generateSongPages = async (render) => {
const fullPath = process.env.REACT_APP_BASE_URL + location;
const logoPath = process.env.REACT_APP_BASE_URL + "/favicon.svg";
+ add_song_to_sitemap(original_artist_slug, name_slug);
+
console.log(`Generating ${artist} - ${song}`);
const html = render
@@ -209,6 +256,7 @@ const generateArtistPages = async (render) => {
const fullPath = process.env.REACT_APP_BASE_URL + location;
const logoPath = process.env.REACT_APP_BASE_URL + "/favicon.svg";
+ add_artist_to_sitemap(original_artist_slug);
console.log(`Generating ${artist}`);
const songs = matchingSongs.map((song) => {
@@ -272,6 +320,8 @@ const generateArtistPages = async (render) => {
console.log(`Generated: ${outputFilePath}`);
}
+ close_sitemap();
+
console.log("All pages generated!");
});
};
diff --git a/jam-ui/cicd/webpack.config.js b/jam-ui/cicd/webpack.config.js
index e7225f117..09d741a9d 100644
--- a/jam-ui/cicd/webpack.config.js
+++ b/jam-ui/cicd/webpack.config.js
@@ -4,7 +4,7 @@ const Dotenv = require("dotenv-webpack");
const environment = process.env.ENVIRONMENT || 'development';
const node_env = process.env.NODE_ENV || 'development';
-
+const debug = node_env == 'development';
module.exports = {
entry: "./client-hydrate.js",
output: {
@@ -42,7 +42,7 @@ module.exports = {
react: path.resolve('./node_modules/react'),
}
},
- devtool: 'eval-source-map',
+ devtool: debug ? 'eval-source-map' : 'source-map',
mode: node_env,
plugins: [
new Dotenv({
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 1.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 1.webp
new file mode 100644
index 000000000..526f13a81
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 1.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 2.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 2.webp
new file mode 100644
index 000000000..7e4e68ba3
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 2.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 3.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 3.webp
new file mode 100644
index 000000000..4836923f9
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 3.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 4.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 4.webp
new file mode 100644
index 000000000..d07e1653b
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 4.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 5.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 5.webp
new file mode 100644
index 000000000..d49a40ed4
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 5.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 6.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 6.webp
new file mode 100644
index 000000000..2bc7c3406
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 6.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 7.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 7.webp
new file mode 100644
index 000000000..9c8e3cc96
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 7.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 8.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 8.webp
new file mode 100644
index 000000000..0c30052cb
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 8.webp differ
diff --git a/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 9.webp b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 9.webp
new file mode 100644
index 000000000..5af0ca4fb
Binary files /dev/null and b/jam-ui/public/img/landing/jamtracks/Top 10 Image - Number 9.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 1.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 1.webp
new file mode 100644
index 000000000..526f13a81
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 1.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 2.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 2.webp
new file mode 100644
index 000000000..7e4e68ba3
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 2.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 3.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 3.webp
new file mode 100644
index 000000000..4836923f9
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 3.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 4.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 4.webp
new file mode 100644
index 000000000..d07e1653b
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 4.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 5.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 5.webp
new file mode 100644
index 000000000..d49a40ed4
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 5.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 6.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 6.webp
new file mode 100644
index 000000000..2bc7c3406
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 6.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 7.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 7.webp
new file mode 100644
index 000000000..9c8e3cc96
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 7.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 8.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 8.webp
new file mode 100644
index 000000000..0c30052cb
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 8.webp differ
diff --git a/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 9.webp b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 9.webp
new file mode 100644
index 000000000..5af0ca4fb
Binary files /dev/null and b/jam-ui/src/assets/img/landing/jamtracks/Top 10 Image - Number 9.webp differ
diff --git a/jam-ui/src/components/jamtracks/JKJamTracksArtistLandingBody.js b/jam-ui/src/components/jamtracks/JKJamTracksArtistLandingBody.js
index 214eaa51e..a4379a21f 100644
--- a/jam-ui/src/components/jamtracks/JKJamTracksArtistLandingBody.js
+++ b/jam-ui/src/components/jamtracks/JKJamTracksArtistLandingBody.js
@@ -7,15 +7,15 @@ import {JamTrackPreviewProvider} from '../../context/JamTrackPreviewContext'
import {useHistory} from "react-router-dom";
import useJamTrackShopping from "../../hooks/useJamTrackShopping";
import UserAuth, {useAuth} from '../../context/UserAuth';
-const awesome1 = '/img/landing/jamtracks/Top 10 Image - Number 1.png';
-const awesome2 = '/img/landing/jamtracks/Top 10 Image - Number 2.png';
-const awesome3 = '/img/landing/jamtracks/Top 10 Image - Number 3.png';
-const awesome4 = '/img/landing/jamtracks/Top 10 Image - Number 4.png';
-const awesome5 = '/img/landing/jamtracks/Top 10 Image - Number 5.png';
-const awesome6 = '/img/landing/jamtracks/Top 10 Image - Number 6.png';
-const awesome7 = '/img/landing/jamtracks/Top 10 Image - Number 7.png';
-const awesome8 = '/img/landing/jamtracks/Top 10 Image - Number 8.png';
-const awesome9 = '/img/landing/jamtracks/Top 10 Image - Number 9.png';
+const awesome1 = '/img/landing/jamtracks/Top 10 Image - Number 1.webp';
+const awesome2 = '/img/landing/jamtracks/Top 10 Image - Number 2.webp';
+const awesome3 = '/img/landing/jamtracks/Top 10 Image - Number 3.webp';
+const awesome4 = '/img/landing/jamtracks/Top 10 Image - Number 4.webp';
+const awesome5 = '/img/landing/jamtracks/Top 10 Image - Number 5.webp';
+const awesome6 = '/img/landing/jamtracks/Top 10 Image - Number 6.webp';
+const awesome7 = '/img/landing/jamtracks/Top 10 Image - Number 7.webp';
+const awesome8 = '/img/landing/jamtracks/Top 10 Image - Number 8.webp';
+const awesome9 = '/img/landing/jamtracks/Top 10 Image - Number 9.webp';
// To test this component in isolation, go to:
// http://beta.jamkazam.local:4000/public/backing-tracks/artist/song
// But this is only for development
diff --git a/jam-ui/src/components/jamtracks/JKJamTracksLandingBody.js b/jam-ui/src/components/jamtracks/JKJamTracksLandingBody.js
index dbf55ca86..b4626536e 100644
--- a/jam-ui/src/components/jamtracks/JKJamTracksLandingBody.js
+++ b/jam-ui/src/components/jamtracks/JKJamTracksLandingBody.js
@@ -7,15 +7,15 @@ import {JamTrackPreviewProvider} from '../../context/JamTrackPreviewContext'
import {useHistory} from "react-router-dom";
import useJamTrackShopping from "../../hooks/useJamTrackShopping";
import UserAuth, {useAuth} from '../../context/UserAuth';
-const awesome1 = '/img/landing/jamtracks/Top 10 Image - Number 1.png';
-const awesome2 = '/img/landing/jamtracks/Top 10 Image - Number 2.png';
-const awesome3 = '/img/landing/jamtracks/Top 10 Image - Number 3.png';
-const awesome4 = '/img/landing/jamtracks/Top 10 Image - Number 4.png';
-const awesome5 = '/img/landing/jamtracks/Top 10 Image - Number 5.png';
-const awesome6 = '/img/landing/jamtracks/Top 10 Image - Number 6.png';
-const awesome7 = '/img/landing/jamtracks/Top 10 Image - Number 7.png';
-const awesome8 = '/img/landing/jamtracks/Top 10 Image - Number 8.png';
-const awesome9 = '/img/landing/jamtracks/Top 10 Image - Number 9.png';
+const awesome1 = '/img/landing/jamtracks/Top 10 Image - Number 1.webp';
+const awesome2 = '/img/landing/jamtracks/Top 10 Image - Number 2.webp';
+const awesome3 = '/img/landing/jamtracks/Top 10 Image - Number 3.webp';
+const awesome4 = '/img/landing/jamtracks/Top 10 Image - Number 4.webp';
+const awesome5 = '/img/landing/jamtracks/Top 10 Image - Number 5.webp';
+const awesome6 = '/img/landing/jamtracks/Top 10 Image - Number 6.webp';
+const awesome7 = '/img/landing/jamtracks/Top 10 Image - Number 7.webp';
+const awesome8 = '/img/landing/jamtracks/Top 10 Image - Number 8.webp';
+const awesome9 = '/img/landing/jamtracks/Top 10 Image - Number 9.webp';
// To test this component in isolation, go to:
// http://beta.jamkazam.local:4000/public/backing-tracks/artist/song
// But this is only for development
diff --git a/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee b/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee
index 4510b3061..c58074524 100644
--- a/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee
+++ b/web/app/assets/javascripts/react-components/landing/JamTrackLandingBottomPage.js.jsx.coffee
@@ -16,7 +16,7 @@ context = window
1
Huge, High Quality Multi-Track Catalog
-
+
JamKazam offers a catalog of 3,700+ songs. Each song is reviewed for quality, and every recording
is a complete multi-track, with fully isolated tracks for each part of the music - e.g. lead vocal,
backing vocals, lead guitar, rhythm guitar, keys, bass, drums, etc. This gives you complete creative control
@@ -28,7 +28,7 @@ context = window
2
Solo, Mute, Pan or Set Level on Any Part
-
+
When learning to play a part, it's incredibly valuable to be able to hear just one part in isolation.
Once you've learned your part, you can turn around and mute just that one part, and then play along with the rest of the band.
Or if you prefer, you can turn that part down low but keep it around as a subtle hint. Or pan the recorded track into
@@ -40,7 +40,7 @@ context = window
3
Make Custom Mixes
-
+
When you've customized the JamTrack mix, you can easily save your custom mixes to use them again later without
having to recreate them. Your custom mixes are saved to the JamKazam cloud, so you can access them from almost
any Internet-connected device. If you want to use your mixes outside the JamKazam app, you can also export custom mixes
@@ -52,7 +52,7 @@ context = window
4
Slow Down For Practice
-
+
You can easily slow down playback of your JamTrack by a specific % without changing pitch, so that the song still
sounds "right", just slower. This is great for building your technique on tougher sections while gradually increasing tempo.
You can also make JamTracks play faster if you want to hit the jets.
@@ -63,7 +63,7 @@ context = window
5
Change Pitch/Key
-
+
If you're a singer and you need to bring the song down into your vocal range, or if you're an instrumentalist
and want to change the piece to a different key, the JamKazam app lets you change the pitch of any JamTrack up or down
by a specified number of semitones (half steps).
@@ -74,7 +74,7 @@ context = window
6
Apply VST & AU Audio Plug-In Effects
-
+
The free JamKazam app lets you easily apply VST & AU plugin effects to your live performance, mixed together
seamlessly with JamTrack playback. For example, guitarists can apply popular amp sims like AmpliTube to get
just the right guitar tone to match the song, and vocalists can apply effects like reverb, pitch correction, etc.
@@ -85,7 +85,7 @@ context = window
7
Use MIDI Instruments
-
+
The free JamKazam app also lets you use MIDI instruments, and mix and record this instrumental audio with JamTracks.
For example, keys players can use MIDI keyboard controllers with VST & AU plugins to generate traditional piano sounds,
Rhodes electric piano, Hammond organ, and other classic keys tones. And drummers who use electronic kits can use their favorite
@@ -135,7 +135,7 @@ context = window
10
JamTracks Work With All Your Stuff
-
+
You can use your JamTracks with any device that can run a standard web browser for playback of the JamTracks.
If you want to mix your live performance with the JamTrack for recordings, and to access other advanced
features, you'll need to use a JamKazam app. Our app is currently available for Mac and Windows computers,