Теперь мне надо придумать с поиском по городу, который брался бы из базы данных, чтоб можно было искать по городу и не было никакой путаницы. В данный момент при регистрации можно в свободной форме ввести город, поиска по городу нет. P.S: используй квадратные кавычки, когда будешь давать мне ответ

app.js:
const express = require("express");
const fs = require("fs");
const session = require("express-session");
const fileUpload = require("express-fileupload");
const app = express();


app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(express.urlencoded({ extended: true }));
app.use(fileUpload());
app.use(session({
  secret: "mysecretkey",
  resave: false,
  saveUninitialized: false
}));

const predefinedGenres = ['Rock', 'Pop', 'Jazz', 'Hip Hop', 'Electronic', 'Blues'];

function getMusicianById(id) {
  const data = fs.readFileSync("./db/musicians.json");
  const musicians = JSON.parse(data);

  return musicians.musicians.find(musician => musician.id === id);
}

function requireLogin(req, res, next) {
  if (req.session.musicianId) {
    next();
  } else {
    res.redirect("/login");
  }
}

function search(query = '', role = '') {
  const data = fs.readFileSync('./db/musicians.json');
  const musicians = JSON.parse(data).musicians.map(musician => {
    return {
      name: musician.name,
      genre: musician.genre,
      originalName: musician.name,
      profileLink: `/profile/${musician.id}`,
      thumbnail: musician.thumbnail,
      soundcloud: musician.soundcloud,
      role: musician.role
    };
  });

  let results = [];

  if (query || role) {
    const lowerQuery = query.toLowerCase();
    results = musicians.filter(musician => {
      const nameScore = musician.name.toLowerCase().startsWith(lowerQuery) ? 2 : musician.name.toLowerCase().includes(lowerQuery) ? 1 : 0;
      const genreScore = musician.genre.toLowerCase().startsWith(lowerQuery) ? 2 : musician.genre.toLowerCase().includes(lowerQuery) ? 1 : 0;
      return nameScore + genreScore > 0 && (role === '' || musician.role === role);
    }).sort((a, b) => {
      const aNameScore = a.name.toLowerCase().startsWith(lowerQuery) ? 2 : a.name.toLowerCase().includes(lowerQuery) ? 1 : 0;
      const bNameScore = b.name.toLowerCase().startsWith(lowerQuery) ? 2 : b.name.toLowerCase().includes(lowerQuery) ? 1 : 0;
      const aGenreScore = a.genre.toLowerCase().startsWith(lowerQuery) ? 2 : a.genre.toLowerCase().includes(lowerQuery) ? 1 : 0;
      const bGenreScore = b.genre.toLowerCase().startsWith(lowerQuery) ? 2 : b.genre.toLowerCase().includes(lowerQuery) ? 1 : 0;
      return (bNameScore + bGenreScore) - (aNameScore + aGenreScore);
    });
  }

  return results;
}

app.use((req, res, next) => {
  if (req.session.musicianId) {
    const musician = getMusicianById(req.session.musicianId);
    res.locals.musician = musician;
    res.locals.userLoggedIn = true;
    res.locals.username = musician.name;
  } else {
    res.locals.userLoggedIn = false;
  }

  next();
});

app.get("/", (req, res) => {
  const data = fs.readFileSync("./db/musicians.json");
  const musicians = JSON.parse(data);

  res.render("index", { musicians: musicians.musicians });
});

app.get("/register", (req, res) => {
  if (req.session.musicianId) {
    const musician = getMusicianById(req.session.musicianId);
    res.redirect("/profile/" + musician.id);
  } else {
    res.render("register");
  }
});

app.post("/register", (req, res) => {
  if (req.session.musicianId) {
    const musician = getMusicianById(req.session.musicianId);
    res.redirect("/profile/" + musician.id);
  } else {
    const data = fs.readFileSync("./db/musicians.json");
    const musicians = JSON.parse(data);

    const newMusician = {
      id: musicians.musicians.length + 1,
      name: req.body.name,
      genre: req.body.genre,
      instrument: req.body.instrument,
      soundcloud: req.body.soundcloud,
      password: req.body.password,
      location: req.body.location,
	  role: req.body.role,
      login: req.body.login
    };

    if (req.files && req.files.thumbnail) {
      const file = req.files.thumbnail;
      const filename = "musician_" + newMusician.id + "_" + file.name;
      file.mv("./public/img/" + filename);

      newMusician.thumbnail = filename;
    }

    musicians.musicians.push(newMusician);
    fs.writeFileSync("./db/musicians.json", JSON.stringify(musicians));

    req.session.musicianId = newMusician.id;
    res.redirect("/profile/" + newMusician.id);
  }
});

app.get("/profile/:id", (req, res) => {
  const musician = getMusicianById(parseInt(req.params.id));

  if (musician) {
    res.render("profile", { musician: musician });
  } else {
    res.status(404).send("Musician not found");
  }
});

app.get("/login", (req, res) => {
  res.render("login");
});

app.post("/login", (req, res) => {
  const data = fs.readFileSync("./db/musicians.json");
  const musicians = JSON.parse(data);

  const musician = musicians.musicians.find(musician => musician.login === req.body.login && musician.password === req.body.password);

  if (musician) {
    req.session.musicianId = musician.id;
    res.redirect("/profile/" + musician.id);

  } else {
    res.render("login", { error: "Invalid login or password" });
  }
});

app.get("/logout", (req, res) => {
  req.session.destroy();
  res.redirect("/");
});

app.get('/search', (req, res) => {
  const query = req.query.query || '';
  const role = req.query.role || '';
  let musicians = [];

  if (query || role) {
    musicians = search(query, role);
  } else {
    const data = fs.readFileSync('./db/musicians.json');
    musicians = JSON.parse(data).musicians.map(musician => {
      return {
        name: musician.name,
        genre: musician.genre,
        originalName: musician.name,
        profileLink: `/profile/${musician.id}`,
        thumbnail: musician.thumbnail,
        soundcloud: musician.soundcloud,
        role: musician.role
      };
    });
  }

  res.locals.predefinedGenres = predefinedGenres;
  res.render('search', { musicians, query, role });

  res.redirect('/search');
});

app.get("/profile/:id/edit", requireLogin, (req, res) => {
  const musician = getMusicianById(parseInt(req.params.id));

  if (musician) {
    if (req.session.musicianId === musician.id) { // Check if the logged-in user is the owner of the profile
      res.render("edit-profile", { musician: musician });
    } else {
      res.status(403).send("Access denied");
    }
  } else {
    res.status(404).send("Musician not found");
  }
});





app.post('/profile/:id/edit', requireLogin, (req, res) => {
  const musician = getMusicianById(parseInt(req.params.id));

  if (musician) {
    if (!req.body.name || !req.body.genre) {
      res.status(400).send('Please fill out all fields');
    
    } else {
      musician.name = req.body.name;
      musician.genre = req.body.genre;
      musician.instrument = req.body.instrument;
      musician.soundcloud = req.body.soundcloud;
	  musician.soundcloud1 = req.body.soundcloud1;
  musician.soundcloud2 = req.body.soundcloud2;
      musician.location = req.body.location;
	  musician.role = req.body.role;
      musician.bio = req.body.bio;

      if (req.files && req.files.thumbnail) {
        const file = req.files.thumbnail;
        const filename = 'musician_' + musician.id + '_' + file.name;
        file.mv('./public/img/' + filename);
        musician.thumbnail = filename;
      }

      const data = fs.readFileSync('./db/musicians.json');
      const musicians = JSON.parse(data);
      const index = musicians.musicians.findIndex(m => m.id === musician.id);
      musicians.musicians[index] = musician;

      fs.writeFileSync('./db/musicians.json', JSON.stringify(musicians));

      res.redirect('/profile/' + musician.id);
    }
  } else {
    res.status(404).send('Musician not found');
  }
  
  
});

function isValidSoundCloudUrl(url) {
  return url.startsWith('https://soundcloud.com/');
}

app.listen(3000, () => {
  console.log("Server started on port 3000");
});

register.ejs:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <link rel="stylesheet" href="/css/main.css" />
    <title>Register as a Musician</title>
  </head>
  <body>
    <header>
      <nav>
        <ul>
          <li><a href="/">Home</a></li>
          <li><a href="/register">Register</a></li>
          <li><a href="/search">Search</a></li>
        </ul>
      </nav>
    </header>
    <main>
      <h1>Register as a Musician</h1>
      <form method="post" enctype="multipart/form-data">
  <label for="name">Name</label>
  <input type="text" id="name" name="name" required>
  
  <label for="role">Role</label>
  <select id="role" name="role" required  onchange="showInstrument(this.value)">
    <option value="">Select a role</option>
    <option value="Band">A band</option>
    <option value="Artist">Artist</option>
  </select>

  <label for="genre">Genre</label>
  <select id="genre" name="genre" required>
    <option value="">Select a genre</option>
    <option value="Rock">Rock</option>
    <option value="Pop">Pop</option>
    <option value="Hip hop">Hip hop</option>
    <option value="Electronic">Electronic</option>
  </select>

  <label for="instrument" id="instrument-label" style="display: none">Instrument</label>
<select id="instrument" name="instrument" style="display: none">
    <option value="">Select a instrument</option>
    <option value="Bass">Bass</option>
    <option value="Rythm guitar">Rythm guitar</option>
    <option value="Lead guitar">Lead guitar</option>
    <option value="Vocal">Vocal</option>
  </select>

  <label for="soundcloud">SoundCloud URL</label>
  <input type="url" id="soundcloud" name="soundcloud">

  <label for="password">Password</label>
  <input type="password" id="password" name="password" required>

  <label for="location">Location</label>
  <input type="text" id="location" name="location" required>

  <label for="login">Login</label>
  <input type="text" id="login" name="login" required>

  <label for="thumbnail">Thumbnail</label>
  <input type="file" id="thumbnail" name="thumbnail">

  <button type="submit">Register</button>
</form>
    </main>
	
	<script>
function showInstrument(role) {
    const instrumentLabel = document.querySelector('#instrument-label');
    const instrumentSelect = document.querySelector('#instrument');
    if (role === 'Artist') {
        instrumentLabel.style.display = 'block';
        instrumentSelect.style.display = 'block';
    } else {
        instrumentLabel.style.display = 'none';
        instrumentSelect.style.display = 'none';
    }
}
</script>
	
  </body>
</html>
search.ejs:
<!DOCTYPE html>
<html>
<head>
	<title>Search Musicians</title>
</head>
<body>
	<h1>Search Musicians</h1>
	<form action="/search" method="get">
		<label for="query">Search by name or genre:</label> <input id="query" name="query" type="text" value="<%= query %>"><br>
		<br>
		<label for="role">Search by role:</label> <select id="role" name="role">
			<option value="">
				All
			</option>
			<option selected value="Band">
				Band
			</option>
			<option selected value="Artist">
				Artist
			</option>
		</select><br>
		<br>
		<button type="submit">Search</button>
	</form><%if (musicians.length > 0) { %>
	<h2>Results:</h2>
	<ul>
		<%musicians.forEach(musician => { %>
		<li>
			<a href="<%= musician.profileLink %>"><%= musician.name %> <%if (musician.thumbnail) { %> <img src="/img/<%= musician.thumbnail %>" alt="<%= musician.name %>"> <%} %></a> - <%= musician.genre %> <%if (musician.soundcloud) { %> <a href="%3C%=%20musician.soundcloud%20%%3E">SoundCloud</a> <%} %>
		</li><%}); %>
	</ul><%} else if (query || role) { %>
	<p>No musicians found.</p><%} %>
	<script>
	document.querySelector('form').addEventListener('submit', function (event) { event.preventDefault(); const query = document.querySelector('#query').value; const role = document.querySelector('#role').value; const url = '/search?query=' + encodeURIComponent(query) + '&role=' + encodeURIComponent(role); window.location.href = url; }); 
	</script>
</body>
</html>
profile.ejs:
<!DOCTYPE html>
<html>
  <head>
    <title><%= musician.name %> - Musician Profile</title>
  </head>
  <body>
    <img src="/img/<%= musician.thumbnail %>" alt="<%= musician.name %>">
    <h1><%= musician.name %></h1>
	<p><strong>Role:</strong> <%= musician.role %></p>
    <p><strong>Genre:</strong> <%= musician.genre %></p>
   <% if (musician.role === 'Artist' && musician.instrument) { %>
<p><strong>Instrument:</strong> <%= musician.instrument %></p>
<% } %>
    <p><strong>Location:</strong> <%= musician.location %></p>
    <p><strong>Bio:</strong> <%= musician.bio %></p>
	<% if (musician.soundcloud) { %>
	<iframe width="50%" height="150" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=<%= musician.soundcloud %>&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe> 
	<% } %>
	<% if (musician.soundcloud1) { %>
	<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=<%= musician.soundcloud1 %>&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe> 
<% } %>
    <% if (userLoggedIn && username === musician.name) { %>
      <a href="/profile/<%= musician.id %>/edit">Edit profile</a>

      <div id="edit-profile-modal" class="modal">
        <div class="modal-content">
          <span class="close">&times;</span>
          <h2>Edit Profile</h2>
          <form action="/profile/<%= musician.id %>/edit" method="POST" enctype="multipart/form-data">
            <div>
              <label for="name">Name:</label>
              <input type="text" id="name" name="name" value="<%= musician.name %>">
            </div>
			<div>
              <label for="name">Role:</label>
              <input type="role" id="role" name="role" value="<%= musician.role %>">
            </div>
            <div>
              <label for="genre">Genre:</label>
              <input type="text" id="genre" name="genre" value="<%= musician.genre %>">
            </div>
            <div>
              <label for="instrument">Instrument:</label>
              <input type="text" id="instrument" name="instrument" value="<%= musician.instrument %>">
            </div>
            <div>
              <label for="location">Location:</label>
              <input type="text" id="location" name="location" value="<%= musician.location %>">
            </div>
            <div>
              <label for="bio">Bio:</label>
              <textarea id="bio" name="bio"><%= musician.bio %></textarea>
            </div>

            <div>
            <label for="soundcloud">Song 1:</label>
            <input type="text" id="soundcloud" name="soundcloud" value="<%= musician.soundcloud %>">
          </div>
		  
		  <div>
            <label for="soundcloud">Song 2:</label>
            <input type="text" id="soundcloud1" name="soundcloud1" value="<%= musician.soundcloud1 %>">
          </div>
		  
          <div>
            <label for="thumbnail">Thumbnail:</label>
            <input type="file" id="thumbnail" name="thumbnail">
          </div>
          <button type="submit">Save</button>
        </form>
      </div>
    </div>

			<!-- 
                <div> 
				<input type="text" name="soundcloud[]" placeholder="Soundcloud track URL"> 
				<button type="button" class="add-music-button">Add Music</button> 
				</div>
              </div>
            </div>

            <div>
              <label for="thumbnail">Thumbnail:</label>
              <input type="file" id="thumbnail" name="thumbnail">
            </div>

            <button type="submit">Save</button>
          </form>
        </div>
      </div> -->
    <% } %>

    <script>
      
 const modal = document.getElementById("edit-profile-modal");
      const btn = document.getElementsByTagName("a")[0];
      const span = document.getElementsByClassName("close")[0];

      btn.onclick = function() {
        modal.style.display = "block";
      }

      span.onclick = function() {
        modal.style.display = "none";
      }

      window.onclick = function(event) {
        if (event.target == modal) {
          modal.style.display = "none";
        }
      }
	  
	  //скрыть плеер, если ссылка не внесена
	const song1Input = document.getElementById("soundcloud");
const song2Input = document.getElementById("soundcloud1");
const player1 = document.getElementsByTagName('iframe')[0];
const player2 = document.getElementsByTagName('iframe')[1];
let songs = {
  song: "",
  song1: ""
}

function hidePlayer(player) {
    player.src = "";
    player.style.display = "none";
}

function updateSongs() {
  songs.song = song1Input.value.trim();
  songs.song1 = song2Input.value.trim();
}

function updatePlayers() {
  if (songs.song !== "") {
    player1.src = `https://w.soundcloud.com/player/?url=${songs.song}&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true`;
    player1.style.display = "block";
  } else {
    hidePlayer(player1);
  }

  if (songs.song1 !== "") {
    player2.src = `https://w.soundcloud.com/player/?url=${songs.song1}&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true`;
    player2.style.display = "block";
  } else {
    hidePlayer(player2);
  }
}

song1Input.addEventListener("input", function() {
  updateSongs();
  updatePlayers();
});

song2Input.addEventListener("input", function() {
  updateSongs();
  updatePlayers();
});

updateSongs();
updatePlayers();
//Валидация ссылок с soundcloud
function updatePlayers() {
  if (isValidSoundcloudUrl(songs.song)) {
    player1.src = `https://w.soundcloud.com/player/?url=${songs.song}&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true`;
    player1.style.display = "block";
  } else {
    hidePlayer(player1);
  }

  if (isValidSoundcloudUrl(songs.song1)) {
    player2.src = `https://w.soundcloud.com/player/?url=${songs.song1}&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true`;
    player2.style.display = "block";
  } else {
    hidePlayer(player2);
  }
}

function isValidSoundcloudUrl(url) {
  const regex = /^https?:\/\/(soundcloud\.com|snd\.sc)\/(.*)$/;
  return regex.test(url);
}
    </script>
	<style>
	
</style>
  </body>
</html>