DashXx / plugins /ncs.js
HerzaJ's picture
Update plugins/ncs.js
bf0a0d0 verified
// SCRAPE BY NEKOLABS
// CHANNEL WA: https://whatsapp.com/channel/0029VbANq6v0VycMue9vPs3u
const axios = require("axios");
const cheerio = require("cheerio");
class NCS {
constructor() {
this.baseUrl = "https://ncs.io";
this.validGenres = {
"31": "Alternative Dance", "33": "Alternative Pop", "23": "Ambient", "34": "Anti-Pop",
"1": "Bass", "18": "Bass House", "26": "Brazilian Phonk", "27": "Breakbeat",
"2": "Chill", "24": "Chill Bass", "35": "Chill Pop", "85": "Colour Bass",
"65": "Complextro", "36": "Dance-Pop", "66": "Deep House", "45": "Disco",
"46": "Disco House", "3": "Drum & Bass", "4": "Drumstep", "5": "Dubstep",
"6": "EDM", "47": "Electro", "48": "Electro House", "7": "Electronic",
"39": "Electronic Pop", "83": "Electronic Rock", "17": "Future Bass", "68": "Future Bounce",
"8": "Future House", "69": "Future Rave", "57": "Future Trap", "40": "Futurepop",
"51": "Garage", "15": "Glitch Hop", "82": "Hardcore", "9": "Hardstyle",
"10": "House", "41": "Hyperpop", "11": "Indie Dance", "91": "J-Pop",
"84": "Jersey Club", "28": "Jump-Up", "29": "Liquid DnB", "60": "Lofi Hip-Hop",
"12": "Melodic Dubstep", "54": "Melodic House", "22": "Midtempo Bass", "30": "Neurofunk",
"87": "Nu-Jazz", "16": "Phonk", "86": "Pluggnb", "19": "Pop",
"55": "Progressive House", "88": "RnB", "89": "Speed Garage", "73": "Tech House",
"80": "Techno", "81": "Trance", "14": "Trap", "74": "Tribal House",
"21": "UKG", "90": "Witch House"
};
this.validMoods = {
"1": "Angry", "33": "angry", "26": "Chasing", "2": "Dark", "35": "dark",
"36": "dramatic", "3": "Dreamy", "27": "Eccentric", "28": "Elegant", "6": "energetic",
"4": "Epic", "5": "Euphoric", "37": "exciting", "7": "Fear", "29": "Floating",
"8": "Funny", "9": "Glamorous", "10": "Gloomy", "11": "Happy", "30": "Heavy",
"12": "Hopeful", "13": "Laid Back", "38": "majestic", "14": "Mysterious", "34": "negative",
"39": "neutral", "15": "Peaceful", "40": "positive", "32": "powerful", "16": "Quirky",
"17": "relaxed", "18": "Restless", "19": "romantic", "20": "sad", "21": "scary",
"31": "Sentimental", "22": "Sexy", "23": "Suspense", "41": "tense", "24": "Weird"
};
}
validateParam(type, value) {
const validList = type === "genre" ? this.validGenres : this.validMoods;
return value && validList[value] ? String(value) : "";
}
async searchTracks(query, genre = "", mood = "") {
try {
const validGenre = this.validateParam("genre", genre);
const validMood = this.validateParam("mood", mood);
const url = `${this.baseUrl}/music-search?q=${encodeURIComponent(query)}&genre=${validGenre}&mood=${validMood}`;
const { data } = await axios.get(url, {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
});
const $ = cheerio.load(data);
const tracks = [];
$("table.tablesorter tbody tr").each((_, el) => {
const $row = $(el);
const $play = $row.find(".player-play");
const tid = $play.attr("data-tid") || "";
const title = $play.attr("data-track") || "";
const artist = $play.attr("data-artistraw") || "";
const versions = $play.attr("data-versions") || "";
const genre = $play.attr("data-genre") || "";
const previewUrl = $play.attr("data-url") || "";
const previewStart = $play.attr("data-preview") || "0";
const image = $row.find("td img[alt]").attr("src") || "";
const genres = [];
const moods = [];
$row.find("td:nth-child(5) a.tag").each((i, tag) => {
const $tag = $(tag);
const text = $tag.text().trim();
const href = $tag.attr("href") || "";
if (href.includes("genre=")) genres.push(text);
else if (href.includes("mood=")) moods.push(text);
});
const releaseDate = $row.find("td:nth-child(6)").text().trim();
if (tid && title) {
tracks.push({
tid,
title,
artist,
versions,
genre,
image,
genres,
moods,
previewUrl,
previewStart,
releaseDate
});
}
});
return tracks;
} catch (err) {
console.error("Error while searching NCS:", err.message);
return [];
}
}
}
const ncs = new NCS();
const handler = async (req, res) => {
try {
const { text, genre, mood } = req.query;
if (!text) {
return res.status(400).json({
success: false,
error: 'Missing required parameter: text'
});
}
const results = await ncs.searchTracks(text, genre || "", mood || "");
res.json({
author: 'Herza',
success: true,
data: results
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
};
module.exports = {
name: 'NCS Music Search',
description: 'Search NoCopyrightSounds tracks by keyword with optional genre and mood filters',
type: 'GET',
routes: ['api/search/ncs'],
tags: ['search', 'music', 'ncs', 'tools'],
parameters: ['text', 'genre (optional)', 'mood (optional)'],
enabled: true,
main: ['Search'],
handler
};