From 85b557c40dc1566fa74b29592e0e367e8943a6fe Mon Sep 17 00:00:00 2001 From: ibratabian17 Date: Tue, 10 Sep 2024 00:06:58 +0800 Subject: [PATCH] Rewrite the songdb library --- core/lib/songdb.js | 274 ++++++++++++++++++++------------------------- 1 file changed, 122 insertions(+), 152 deletions(-) diff --git a/core/lib/songdb.js b/core/lib/songdb.js index f4e24d0..63d7e63 100644 --- a/core/lib/songdb.js +++ b/core/lib/songdb.js @@ -1,20 +1,21 @@ -//Songdbs Property -const settings = require('../../settings.json') +const settings = require('../../settings.json'); const fs = require('fs'); -const path = require('path') -const { loadJsonFile } = require('../helper') -const songdbF = {} -const main = { - songdb: { "2016": {}, "2017": {}, "2018": {}, "2019": {}, "2020": {}, "2021": {}, "2022": {} }, - localisation: {} -} -songdbF.db = {} +const path = require('path'); +const { loadJsonFile } = require('../helper'); -//Use layered songdb if available -main.localisation = loadJsonFile('Platforms/openparty-all/localisation.json', '../database/Platforms/openparty-all/localisation.json'); +const songdbF = {}; +const main = { + songdb: { + "2016": {}, "2017": {}, "2018": {}, "2019": {}, + "2020": {}, "2021": {}, "2022": {} + }, + localisation: loadJsonFile('Platforms/openparty-all/localisation.json', '../database/Platforms/openparty-all/localisation.json') +}; + +// Load song database songdbF.db = loadJsonFile('Platforms/openparty-all/songdbs.json', '../database/Platforms/openparty-all/songdbs.json'); -songdbF.missingAssets = { pc: [] } +songdbF.missingAssets = { pc: [] }; songdbF.assetsPlaceholder = { "banner_bkgImageUrl": "https://cdn.discordapp.com/attachments/1119503808653959218/1119518680733192222/New_Project_82_Copy_0ED1403.png", "coach1ImageUrl": "https://jd-s3.cdn.ubi.com/public/map/WantUBack/x1/WantUBack_Coach_1.tga.ckd/5e3b1feb1e38f523cbab509a1590df59.ckd", @@ -26,151 +27,120 @@ songdbF.assetsPlaceholder = { "expandCoachImageUrl": "https://jd-s3.cdn.ubi.com/public/map/WantUBack/x1/WantUBack_Cover_AlbumCoach.tga.ckd/dc01eb7b94e0b10c0f52a0383e51312e.ckd", "videoPreviewVideoURL": "", "map_bkgImageUrl": "https://cdn.discordapp.com/attachments/1119503808653959218/1119518680733192222/New_Project_82_Copy_0ED1403.png" -} +}; + +// Function to generate assets and handle platform differences +songdbF.getAsset = function (platform, codename, overrideMapBkg = false, modifier = (a) => a) { + let currentPlatform = ['pc', 'orbis', 'durango'].includes(platform) ? 'x1' : platform; + let platformAssets = {}; + + if (!songdbF.areAllValuesEmpty(songdbF.db[codename].assets[currentPlatform])) { + platformAssets = { ...songdbF.db[codename].assets[currentPlatform] }; + } else if (!songdbF.areAllValuesEmpty(songdbF.db[codename].assets.common)) { + platformAssets = { ...songdbF.db[codename].assets.common }; + } else { + platformAssets = { ...songdbF.assetsPlaceholder }; + } + + // overrideMapBkg + if (overrideMapBkg || !platformAssets.banner_bkgImageUrl) { + platformAssets.banner_bkgImageUrl = platformAssets.map_bkgImageUrl; + } + + return modifier({ ...platformAssets }); +}; + +// Generate Song Database for a specific platform and version songdbF.generateSongdb = function (platform = 'pc', version = '2017', style = false) { - const newdb = JSON.parse(JSON.stringify({})) - if (parseInt(version) > 2020) { - Object.keys(songdbF.db).forEach(codename => { - var song = JSON.parse(JSON.stringify(songdbF.db[codename])) - var assets = JSON.parse(JSON.stringify(songdbF.getAsset(platform, codename, style))) - if (assets !== songdbF.assetsPlaceholder) { - song.assets = assets - } - songdbF.multimpd = { - "videoEncoding": { - "vp8": `\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp8.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp8.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp8.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp8.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n`, - "vp9": `\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n` - } - } - song.mapPreviewMpd = songdbF.multimpd - if (song.customTypeNameId) song.customTypeName = main.localisation[song.customTypeNameId] ? main.localisation[song.customTypeNameId].en || "" : `MISSING:${[song.customTypeNameId]}` - //check does previewVideoExist?? - if (!song.urls || (song.urls && !song.urls[`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm`])) { - var tempaudioPrev = (song.urls && song.urls[`jmcs://jd-contents/${codename}/${codename}_AudioPreview.ogg`]) || "" - song.urls = { - [`jmcs://jd-contents/${codename}/${codename}_AudioPreview.ogg`]: tempaudioPrev, - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp9.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp9.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp9.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm`]: "" - } - } - newdb[codename] = song - }); - } - if (parseInt(version) < 2020) { - Object.keys(songdbF.db).forEach(codename => { - var song = JSON.parse(JSON.stringify(songdbF.db[codename])) - var assets = {} + const newDb = {}; - if (platform == "pcdreyn") { - assets = JSON.parse(JSON.stringify(songdbF.getAsset(platform, codename, style, function (platformAssets) { - platformAssets.expandBkgImageUrl = platformAssets.cover_1024ImageUrl - if (platformAssets.song_TitleImageUrl) platformAssets.cover_smallImageUrl = platformAssets.song_TitleImageUrl - return platformAssets - }))) - const jDiff = { "1": "Easy", "2": "Medium", "3": "Hard", "4": "Extreme" } - const jCoaches = { "1": "Easy", "2": "Medium", "3": "Hard", "4": "Extreme" } - song.credits = `${song.difficulty}: ${jDiff[song.difficulty]} ${song.coachCount}: ${jCoaches[song.coachCount]}` - } else { - assets = JSON.parse(JSON.stringify(songdbF.getAsset(platform, codename, style))) - } - if (assets !== songdbF.assetsPlaceholder) { - song.assets = assets - } + Object.keys(songdbF.db).forEach(codename => { + let song = { ...songdbF.db[codename] }; + let assets = songdbF.getAsset(platform, codename, style); + song.assets = assets; // USE Platform Specific Assets - songdbF.singlempd = `\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n` - var vp9Preview = song.mapPreviewMpd && song.mapPreviewMpd.vp9 ? song.mapPreviewMpd.vp9 : false; - song.mapPreviewMpd = vp9Preview || songdbF.singlempd - if (!Array.isArray(song.skuIds)) { - var skuIds = song.skuIds || {} - song.skuIds = Object.values(skuIds) - } - if (!Array.isArray(song.tags)) { - var tags = song.tags || {} - song.tags = Object.values(tags) - } - if (!Array.isArray(song.searchTagsLocIds)) { - var searchTagsLocIds = song.searchTagsLocIds || {} - song.searchTagsLocIds = Object.values(searchTagsLocIds) - } else if (song.searchTagsLocIds == undefined) { - song.searchTagsLocIds = ["30000315"] - } - if (!Array.isArray(song.searchTags)) { - var searchTags = song.searchTags || {} - song.searchTags = Object.values(searchTags) - } else if (song.searchTags == undefined) { - song.searchTags = [] - } - if (!Array.isArray(song.jdmAttributes)) { - var jdmAttributes = song.jdmAttributes || {} - song.jdmAttributes = Object.values(jdmAttributes) - } - if (song.customTypeNameId) song.customTypeName = main.localisation[song.customTypeNameId] ? main.localisation[song.customTypeNameId].en || "" : `MISSING:${[song.customTypeNameId]}` - if (!song.urls || (song.urls && !song.urls[`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm`])) { - var tempaudioPrev = (song.urls && song.urls[`jmcs://jd-contents/${codename}/${codename}_AudioPreview.ogg`]) || "" - song.urls = { - [`jmcs://jd-contents/${codename}/${codename}_AudioPreview.ogg`]: tempaudioPrev, - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp9.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp9.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp9.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp8.webm`]: "", - [`jmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm`]: "" - } - } - newdb[codename] = song - }); - } - return newdb -} -songdbF.getAsset = function (platform, codename, style = false, modifier = function (a) { return a }) { - var CurrentPlatform = platform - var platformAssets = JSON.parse('{}') - if (platform == 'pc') { CurrentPlatform = 'x1' } - if (!songdbF.areAllValuesEmpty(songdbF.db[codename].assets[CurrentPlatform]) || songdbF.db[codename].assets[CurrentPlatform] == {}) { - platformAssets = JSON.parse(JSON.stringify(songdbF.db[codename].assets[CurrentPlatform])); - } - else if (!songdbF.areAllValuesEmpty(songdbF.db[codename].assets.common) || songdbF.db[codename].assets[CurrentPlatform] == {}) { - platformAssets = JSON.parse(JSON.stringify(songdbF.db[codename].assets.common)); + if (2020 >= version) song.mapPreviewMpd = songdbF.generateMPD(codename, 'vp8'); + + // Handle custom type name localization + if (song.customTypeNameId) { + song.customTypeName = main.localisation[song.customTypeNameId]?.en || `MISSING: ${song.customTypeNameId}`; + } + + // Generate URLs if not available + song.urls = song.urls || songdbF.generateUrls(codename, song); + + // Normalize arrays for JD20- + if (2020 >= version) { + song.skuIds = songdbF.normalizeToArray(song.skuIds); + song.tags = songdbF.normalizeToArray(song.tags); + song.searchTagsLocIds = songdbF.normalizeToArray(song.searchTagsLocIds, ['30000315']); + song.searchTags = songdbF.normalizeToArray(song.searchTags); + song.jdmAttributes = songdbF.normalizeToArray(song.jdmAttributes); + } + + newDb[codename] = song; + }); + + return newDb; +}; + +// Function to handle MPD generation for video encoding +songdbF.getMultiMPD = function (codename) { + return { + "vp8": songdbF.generateMPD(codename, 'vp8'), + "vp9": songdbF.generateMPD(codename, 'vp9') + }; +}; + +// Generate MPD XML dynamically +songdbF.generateMPD = function (codename, codec) { + return `\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_LOW.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_MID.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_HIGH.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tjmcs://jd-contents/${codename}/${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n`; +}; + +// Generate URLs if not available +songdbF.generateUrls = function (codename, song) { + const baseUrl = `jmcs://jd-contents/${codename}/`; + return { + [`${baseUrl}${codename}_AudioPreview.ogg`]: song.urls?.[`${baseUrl}${codename}_AudioPreview.ogg`] || "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_HIGH.vp8.webm`]: "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_HIGH.vp9.webm`]: "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_MID.vp8.webm`]: "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_MID.vp9.webm`]: "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_LOW.vp8.webm`]: "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_LOW.vp9.webm`]: "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_ULTRA.vp8.webm`]: "", + [`${baseUrl}${codename}_MapPreviewNoSoundCrop_ULTRA.vp9.webm`]: "", + // Other URLs go here + }; +}; + +// Normalize value to array +songdbF.normalizeToArray = function (value, defaultValue = []) { + return Array.isArray(value) ? value : Object.values(value || defaultValue); +}; + +// Check if all object values are empty +songdbF.areAllValuesEmpty = function (obj) { + if (obj) { + return Object.values(obj).every(value => value === ""); } else { - platformAssets = songdbF.assetsPlaceholder + return true } - // Return the platformAssets - // Check if style is true or banner_bkgImageUrl is empty, then set banner_bkgImageUrl to map_bkgImageUrl - if (style == true || (!platformAssets.banner_bkgImageUrl || (platformAssets.banner_bkgImageUrl && platformAssets.banner_bkgImageUrl == ""))) { - platformAssets.banner_bkgImageUrl = "" - platformAssets.banner_bkgImageUrl = platformAssets.map_bkgImageUrl - } - platformAssets = JSON.parse(JSON.stringify(modifier(JSON.parse(JSON.stringify(platformAssets))))) - return JSON.parse(JSON.stringify(platformAssets)); -} +}; + +// Generate the entire song database songdbF.generate = function () { - Object.keys(main.songdb).forEach((version) => { - const a = {} - if (version == 2017) a.pcdreyn = JSON.parse(JSON.stringify(songdbF.generateSongdb('pcdreyn', version, true))) - a.pcparty = JSON.parse(JSON.stringify(songdbF.generateSongdb('pc', version, true))) - a.pc = JSON.parse(JSON.stringify(songdbF.generateSongdb('pc', version, false))) - a.nx = JSON.parse(JSON.stringify(songdbF.generateSongdb('nx', version, false))) - a.wiiu = JSON.parse(JSON.stringify(songdbF.generateSongdb('wiiu', version, false))) - main.songdb[version] = a - }) -} -songdbF.areAllValuesEmpty = function (obj) { - for (let key in obj) { - if (obj.hasOwnProperty(key) && obj[key] !== "") { - return false; - } - } - return true; -} + Object.keys(main.songdb).forEach(version => { + main.songdb[version] = { + pcdreyn: {}, + pcparty: songdbF.generateSongdb('pc', version, true), + pc: songdbF.generateSongdb('pc', version, false), + nx: songdbF.generateSongdb('nx', version, false), + wiiu: songdbF.generateSongdb('wiiu', version, false) + }; + }); +}; songdbF.generateSonglist = function () { console.log(`[SONGDB] Processing Songdbs`) @@ -179,4 +149,4 @@ songdbF.generateSonglist = function () { return main.songdb } -module.exports = { songdbF } \ No newline at end of file +module.exports = { songdbF }