vidspotai-shared 1.0.53 → 1.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/globals/aiModels/providers/alibaba.d.ts +4 -0
- package/lib/globals/aiModels/providers/alibaba.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/alibaba.js +183 -0
- package/lib/globals/aiModels/providers/elevenlabs.d.ts +13 -0
- package/lib/globals/aiModels/providers/elevenlabs.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/elevenlabs.js +25 -0
- package/lib/globals/aiModels/providers/pixverseTemplates.d.ts +36 -0
- package/lib/globals/aiModels/providers/pixverseTemplates.d.ts.map +1 -0
- package/lib/globals/aiModels/providers/pixverseTemplates.js +42 -0
- package/lib/globals/aiModels/tierHelpers.d.ts +27 -0
- package/lib/globals/aiModels/tierHelpers.d.ts.map +1 -0
- package/lib/globals/aiModels/tierHelpers.js +73 -0
- package/lib/globals/ttsModels/providers/minimax.d.ts +8 -0
- package/lib/globals/ttsModels/providers/minimax.d.ts.map +1 -0
- package/lib/globals/ttsModels/providers/minimax.js +18 -0
- package/lib/globals/ttsModels/providers/openai.d.ts +8 -0
- package/lib/globals/ttsModels/providers/openai.d.ts.map +1 -0
- package/lib/globals/ttsModels/providers/openai.js +18 -0
- package/lib/globals/types.d.ts +2 -1
- package/lib/globals/types.d.ts.map +1 -1
- package/lib/globals/types.js +1 -0
- package/lib/models/agent.model.d.ts +117 -0
- package/lib/models/agent.model.d.ts.map +1 -0
- package/lib/models/agent.model.js +13 -0
- package/lib/models/analytics.model.d.ts +4 -0
- package/lib/models/analytics.model.d.ts.map +1 -1
- package/lib/models/cachedAsset.model.d.ts +18 -0
- package/lib/models/cachedAsset.model.d.ts.map +1 -0
- package/lib/models/cachedAsset.model.js +2 -0
- package/lib/models/cachedRawAsset.model.d.ts +20 -0
- package/lib/models/cachedRawAsset.model.d.ts.map +1 -0
- package/lib/models/cachedRawAsset.model.js +2 -0
- package/lib/models/video.model.d.ts +1 -0
- package/lib/models/video.model.d.ts.map +1 -1
- package/lib/schemas/agentPersona.schema.d.ts +10 -0
- package/lib/schemas/agentPersona.schema.d.ts.map +1 -0
- package/lib/schemas/agentPersona.schema.js +11 -0
- package/lib/schemas/brandKit.schema.d.ts +101 -0
- package/lib/schemas/brandKit.schema.d.ts.map +1 -0
- package/lib/schemas/brandKit.schema.js +46 -0
- package/lib/schemas/brief.schema.d.ts +216 -0
- package/lib/schemas/brief.schema.d.ts.map +1 -0
- package/lib/schemas/brief.schema.js +118 -0
- package/lib/schemas/index.d.ts +6 -0
- package/lib/schemas/index.d.ts.map +1 -0
- package/lib/schemas/index.js +21 -0
- package/lib/schemas/project.schema.d.ts +1005 -0
- package/lib/schemas/project.schema.d.ts.map +1 -0
- package/lib/schemas/project.schema.js +238 -0
- package/lib/schemas/videoPlan.schema.d.ts +145 -0
- package/lib/schemas/videoPlan.schema.d.ts.map +1 -0
- package/lib/schemas/videoPlan.schema.js +109 -0
- package/lib/services/agent/beatSnap.d.ts +10 -0
- package/lib/services/agent/beatSnap.d.ts.map +1 -0
- package/lib/services/agent/beatSnap.js +128 -0
- package/lib/services/agent/costPreflight.d.ts +22 -0
- package/lib/services/agent/costPreflight.d.ts.map +1 -0
- package/lib/services/agent/costPreflight.js +75 -0
- package/lib/services/agent/critic.d.ts +103 -0
- package/lib/services/agent/critic.d.ts.map +1 -0
- package/lib/services/agent/critic.js +132 -0
- package/lib/services/agent/eval/index.d.ts +5 -0
- package/lib/services/agent/eval/index.d.ts.map +1 -0
- package/lib/services/agent/eval/index.js +20 -0
- package/lib/services/agent/eval/judge.d.ts +14 -0
- package/lib/services/agent/eval/judge.d.ts.map +1 -0
- package/lib/services/agent/eval/judge.js +95 -0
- package/lib/services/agent/eval/recorder.d.ts +17 -0
- package/lib/services/agent/eval/recorder.d.ts.map +1 -0
- package/lib/services/agent/eval/recorder.js +65 -0
- package/lib/services/agent/eval/seedBriefs.d.ts +16 -0
- package/lib/services/agent/eval/seedBriefs.d.ts.map +1 -0
- package/lib/services/agent/eval/seedBriefs.js +1188 -0
- package/lib/services/agent/eval/types.d.ts +196 -0
- package/lib/services/agent/eval/types.d.ts.map +1 -0
- package/lib/services/agent/eval/types.js +65 -0
- package/lib/services/agent/executor.d.ts +50 -0
- package/lib/services/agent/executor.d.ts.map +1 -0
- package/lib/services/agent/executor.js +188 -0
- package/lib/services/agent/index.d.ts +15 -0
- package/lib/services/agent/index.d.ts.map +1 -0
- package/lib/services/agent/index.js +30 -0
- package/lib/services/agent/llmCaller.d.ts +77 -0
- package/lib/services/agent/llmCaller.d.ts.map +1 -0
- package/lib/services/agent/llmCaller.js +16 -0
- package/lib/services/agent/llmCallerGateway.d.ts +39 -0
- package/lib/services/agent/llmCallerGateway.d.ts.map +1 -0
- package/lib/services/agent/llmCallerGateway.js +246 -0
- package/lib/services/agent/llmCallerRegistry.d.ts +4 -0
- package/lib/services/agent/llmCallerRegistry.d.ts.map +1 -0
- package/lib/services/agent/llmCallerRegistry.js +19 -0
- package/lib/services/agent/modelRouter.d.ts +41 -0
- package/lib/services/agent/modelRouter.d.ts.map +1 -0
- package/lib/services/agent/modelRouter.js +57 -0
- package/lib/services/agent/musicSelect.d.ts +23 -0
- package/lib/services/agent/musicSelect.d.ts.map +1 -0
- package/lib/services/agent/musicSelect.js +65 -0
- package/lib/services/agent/personas.d.ts +60 -0
- package/lib/services/agent/personas.d.ts.map +1 -0
- package/lib/services/agent/personas.js +156 -0
- package/lib/services/agent/planner.d.ts +56 -0
- package/lib/services/agent/planner.d.ts.map +1 -0
- package/lib/services/agent/planner.js +237 -0
- package/lib/services/agent/toolRegistry.d.ts +64 -0
- package/lib/services/agent/toolRegistry.d.ts.map +1 -0
- package/lib/services/agent/toolRegistry.js +78 -0
- package/lib/services/agent/tools/analyzeReference.tool.d.ts +36 -0
- package/lib/services/agent/tools/analyzeReference.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/analyzeReference.tool.js +44 -0
- package/lib/services/agent/tools/animateImage.tool.d.ts +23 -0
- package/lib/services/agent/tools/animateImage.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/animateImage.tool.js +58 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts +30 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/animateImageWithMotionBrush.tool.js +90 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts +948 -0
- package/lib/services/agent/tools/composeScene.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/composeScene.tool.js +90 -0
- package/lib/services/agent/tools/estimateCost.tool.d.ts +342 -0
- package/lib/services/agent/tools/estimateCost.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/estimateCost.tool.js +62 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts +32 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateAvatarVideo.tool.js +112 -0
- package/lib/services/agent/tools/generateImage.tool.d.ts +28 -0
- package/lib/services/agent/tools/generateImage.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateImage.tool.js +97 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts +30 -0
- package/lib/services/agent/tools/generateVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateVideo.tool.js +84 -0
- package/lib/services/agent/tools/generateVoiceover.tool.d.ts +18 -0
- package/lib/services/agent/tools/generateVoiceover.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/generateVoiceover.tool.js +72 -0
- package/lib/services/agent/tools/index.d.ts +19 -0
- package/lib/services/agent/tools/index.d.ts.map +1 -0
- package/lib/services/agent/tools/index.js +34 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts +191 -0
- package/lib/services/agent/tools/planVideo.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/planVideo.tool.js +46 -0
- package/lib/services/agent/tools/render.tool.d.ts +357 -0
- package/lib/services/agent/tools/render.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/render.tool.js +48 -0
- package/lib/services/agent/tools/searchMusic.tool.d.ts +49 -0
- package/lib/services/agent/tools/searchMusic.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchMusic.tool.js +74 -0
- package/lib/services/agent/tools/searchStock.tool.d.ts +37 -0
- package/lib/services/agent/tools/searchStock.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchStock.tool.js +101 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.d.ts +59 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.d.ts.map +1 -0
- package/lib/services/agent/tools/searchUserLibrary.tool.js +58 -0
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts +31 -0
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/cameraControl.types.js +2 -0
- package/lib/services/aiGen/canonicalAdapters/index.d.ts +3 -0
- package/lib/services/aiGen/canonicalAdapters/index.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/index.js +18 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts +23 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.d.ts.map +1 -0
- package/lib/services/aiGen/canonicalAdapters/multiShot.types.js +12 -0
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts +18 -0
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/elevenlabs/elevenlabs.service.js +100 -0
- package/lib/services/aiGen/providers/fal/falImage.service.d.ts +9 -0
- package/lib/services/aiGen/providers/fal/falImage.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/fal/falImage.service.js +102 -0
- package/lib/services/aiGen/providers/fal/index.d.ts +2 -0
- package/lib/services/aiGen/providers/fal/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/fal/index.js +17 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts +4 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.d.ts.map +1 -0
- package/lib/services/aiGen/providers/kling/cameraAdapter.js +53 -0
- package/lib/services/aiGen/providers/pexels/index.d.ts +2 -0
- package/lib/services/aiGen/providers/pexels/index.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pexels/index.js +17 -0
- package/lib/services/aiGen/providers/pexels/pexels.service.d.ts +11 -0
- package/lib/services/aiGen/providers/pexels/pexels.service.d.ts.map +1 -0
- package/lib/services/aiGen/providers/pexels/pexels.service.js +118 -0
- package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts +3 -0
- package/lib/services/aiGen/providers/runway/cameraAdapter.d.ts.map +1 -0
- package/lib/services/aiGen/providers/runway/cameraAdapter.js +46 -0
- package/lib/services/analytics.service.d.ts +10 -0
- package/lib/services/analytics.service.d.ts.map +1 -1
- package/lib/services/analytics.service.js +27 -0
- package/lib/services/asr/assemblyai.service.d.ts +72 -0
- package/lib/services/asr/assemblyai.service.d.ts.map +1 -0
- package/lib/services/asr/assemblyai.service.js +89 -0
- package/lib/services/asr/index.d.ts +2 -0
- package/lib/services/asr/index.d.ts.map +1 -0
- package/lib/services/asr/index.js +17 -0
- package/lib/services/assetCache.service.d.ts +54 -0
- package/lib/services/assetCache.service.d.ts.map +1 -0
- package/lib/services/assetCache.service.js +96 -0
- package/lib/services/audioAnalysis/index.d.ts +2 -0
- package/lib/services/audioAnalysis/index.d.ts.map +1 -0
- package/lib/services/audioAnalysis/index.js +17 -0
- package/lib/services/audioAnalysis/onsetDetection.service.d.ts +50 -0
- package/lib/services/audioAnalysis/onsetDetection.service.d.ts.map +1 -0
- package/lib/services/audioAnalysis/onsetDetection.service.js +136 -0
- package/lib/services/editor/designToProject.d.ts +60 -0
- package/lib/services/editor/designToProject.d.ts.map +1 -0
- package/lib/services/editor/designToProject.js +194 -0
- package/lib/services/musicGen/index.d.ts +6 -0
- package/lib/services/musicGen/index.d.ts.map +1 -0
- package/lib/services/musicGen/index.js +26 -0
- package/lib/services/musicGen/musicSearchFactory.service.d.ts +14 -0
- package/lib/services/musicGen/musicSearchFactory.service.d.ts.map +1 -0
- package/lib/services/musicGen/musicSearchFactory.service.js +59 -0
- package/lib/services/musicGen/providers/curated.service.d.ts +22 -0
- package/lib/services/musicGen/providers/curated.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/curated.service.js +171 -0
- package/lib/services/musicGen/providers/jamendo.service.d.ts +8 -0
- package/lib/services/musicGen/providers/jamendo.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/jamendo.service.js +93 -0
- package/lib/services/musicGen/providers/mubert.service.d.ts +9 -0
- package/lib/services/musicGen/providers/mubert.service.d.ts.map +1 -0
- package/lib/services/musicGen/providers/mubert.service.js +113 -0
- package/lib/services/musicGen/types.d.ts +42 -0
- package/lib/services/musicGen/types.d.ts.map +1 -0
- package/lib/services/musicGen/types.js +10 -0
- package/lib/services/tts/providers/minimax.service.d.ts +14 -0
- package/lib/services/tts/providers/minimax.service.d.ts.map +1 -0
- package/lib/services/tts/providers/minimax.service.js +78 -0
- package/lib/services/tts/providers/openai.service.d.ts +14 -0
- package/lib/services/tts/providers/openai.service.d.ts.map +1 -0
- package/lib/services/tts/providers/openai.service.js +71 -0
- package/lib/utils/helpers.d.ts +1 -0
- package/lib/utils/helpers.d.ts.map +1 -1
- package/lib/utils/helpers.js +26 -12
- package/package.json +1 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.detectOnsets = detectOnsets;
|
|
40
|
+
const axios_1 = __importDefault(require("axios"));
|
|
41
|
+
let decodePromise;
|
|
42
|
+
async function loadDecode() {
|
|
43
|
+
if (!decodePromise) {
|
|
44
|
+
decodePromise = Promise.resolve().then(() => __importStar(require("audio-decode"))).then((m) => (m.default ?? m));
|
|
45
|
+
}
|
|
46
|
+
return decodePromise;
|
|
47
|
+
}
|
|
48
|
+
const TIMEOUT_MS = 12000;
|
|
49
|
+
const MAX_DOWNLOAD_BYTES = 30 * 1024 * 1024; // 30MB cap; longer tracks are rare and bloat memory.
|
|
50
|
+
const cache = new Map();
|
|
51
|
+
let essentiaPromise;
|
|
52
|
+
function isEnabled() {
|
|
53
|
+
return process.env.ENABLE_ONSET_DETECTION === "true";
|
|
54
|
+
}
|
|
55
|
+
async function loadEssentia() {
|
|
56
|
+
if (essentiaPromise)
|
|
57
|
+
return essentiaPromise;
|
|
58
|
+
essentiaPromise = (async () => {
|
|
59
|
+
// Dynamic require — keeps the WASM module out of the cold-start path
|
|
60
|
+
// for callers that never invoke onset detection (the default until
|
|
61
|
+
// the commercial license is in place).
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
63
|
+
const mod = require("essentia.js");
|
|
64
|
+
const wasm = mod.EssentiaWASM;
|
|
65
|
+
const inst = new mod.Essentia(wasm);
|
|
66
|
+
return inst;
|
|
67
|
+
})();
|
|
68
|
+
return essentiaPromise;
|
|
69
|
+
}
|
|
70
|
+
async function downloadAudio(url) {
|
|
71
|
+
const res = await axios_1.default.get(url, {
|
|
72
|
+
responseType: "arraybuffer",
|
|
73
|
+
timeout: 8000,
|
|
74
|
+
maxContentLength: MAX_DOWNLOAD_BYTES,
|
|
75
|
+
});
|
|
76
|
+
return Buffer.from(res.data);
|
|
77
|
+
}
|
|
78
|
+
function mixToMono(channels) {
|
|
79
|
+
if (channels.length === 1)
|
|
80
|
+
return channels[0];
|
|
81
|
+
const len = channels[0].length;
|
|
82
|
+
const out = new Float32Array(len);
|
|
83
|
+
for (let i = 0; i < len; i++) {
|
|
84
|
+
let sum = 0;
|
|
85
|
+
for (const ch of channels)
|
|
86
|
+
sum += ch[i];
|
|
87
|
+
out[i] = sum / channels.length;
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
async function runDetection(audioUrl) {
|
|
92
|
+
const buf = await downloadAudio(audioUrl);
|
|
93
|
+
const decode = await loadDecode();
|
|
94
|
+
const decoded = await decode(buf);
|
|
95
|
+
const mono = mixToMono(decoded.channelData);
|
|
96
|
+
const essentia = (await loadEssentia());
|
|
97
|
+
const signal = essentia.arrayToVector(mono);
|
|
98
|
+
const result = essentia.RhythmExtractor2013(signal);
|
|
99
|
+
const beats = [];
|
|
100
|
+
const beatVec = result.beats_position;
|
|
101
|
+
for (let i = 0; i < beatVec.size(); i++)
|
|
102
|
+
beats.push(beatVec.get(i));
|
|
103
|
+
if (!beats.length || !result.bpm)
|
|
104
|
+
return undefined;
|
|
105
|
+
return { bpm: Math.round(result.bpm), onsets: beats };
|
|
106
|
+
}
|
|
107
|
+
function withTimeout(p, ms) {
|
|
108
|
+
return new Promise((resolve) => {
|
|
109
|
+
const t = setTimeout(() => resolve(undefined), ms);
|
|
110
|
+
p.then((v) => {
|
|
111
|
+
clearTimeout(t);
|
|
112
|
+
resolve(v);
|
|
113
|
+
}, () => {
|
|
114
|
+
clearTimeout(t);
|
|
115
|
+
resolve(undefined);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
async function detectOnsets(audioUrl) {
|
|
120
|
+
if (!isEnabled())
|
|
121
|
+
return undefined;
|
|
122
|
+
const hit = cache.get(audioUrl);
|
|
123
|
+
if (hit)
|
|
124
|
+
return hit;
|
|
125
|
+
const analysis = await withTimeout(runDetection(audioUrl), TIMEOUT_MS);
|
|
126
|
+
if (analysis) {
|
|
127
|
+
cache.set(audioUrl, analysis);
|
|
128
|
+
if (cache.size > 100) {
|
|
129
|
+
// Drop oldest entry to bound memory; Map preserves insertion order.
|
|
130
|
+
const firstKey = cache.keys().next().value;
|
|
131
|
+
if (firstKey)
|
|
132
|
+
cache.delete(firstKey);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return analysis;
|
|
136
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Project } from "../../schemas/project.schema";
|
|
2
|
+
/**
|
|
3
|
+
* Inverse of `projectJsonToDesign` (lives in the editor under
|
|
4
|
+
* `src/editor/agent/projectJsonToDesign.ts`). Converts the editor's
|
|
5
|
+
* IDesign-shaped autosave blob into the canonical Project JSON the
|
|
6
|
+
* Remotion renderer consumes.
|
|
7
|
+
*
|
|
8
|
+
* The shared package can't import `@designcombo/types` (editor-only),
|
|
9
|
+
* so the input shape is declared inline as a permissive interface — we
|
|
10
|
+
* read what we need and ignore unknown fields. Producers (the editor's
|
|
11
|
+
* autosave hook) are not formally validated here; the resulting Project
|
|
12
|
+
* is validated by `ProjectSchema.parse()` downstream.
|
|
13
|
+
*/
|
|
14
|
+
interface DesignTrack {
|
|
15
|
+
id: string;
|
|
16
|
+
type: string;
|
|
17
|
+
items?: string[];
|
|
18
|
+
index?: number;
|
|
19
|
+
}
|
|
20
|
+
interface DesignItemBase {
|
|
21
|
+
id: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
type: string;
|
|
24
|
+
display?: {
|
|
25
|
+
from?: number;
|
|
26
|
+
to?: number;
|
|
27
|
+
};
|
|
28
|
+
metadata?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
interface DesignItemDetails extends DesignItemBase {
|
|
31
|
+
details?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
interface DesignBackground {
|
|
34
|
+
type?: "color" | "image" | "transparent";
|
|
35
|
+
value?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface EditorDesignInput {
|
|
38
|
+
id?: string;
|
|
39
|
+
fps?: number;
|
|
40
|
+
size?: {
|
|
41
|
+
width?: number;
|
|
42
|
+
height?: number;
|
|
43
|
+
};
|
|
44
|
+
duration?: number;
|
|
45
|
+
background?: DesignBackground;
|
|
46
|
+
tracks?: DesignTrack[];
|
|
47
|
+
trackItemIds?: string[];
|
|
48
|
+
trackItemsMap?: Record<string, DesignItemBase>;
|
|
49
|
+
trackItemDetailsMap?: Record<string, DesignItemDetails>;
|
|
50
|
+
transitionIds?: string[];
|
|
51
|
+
transitionsMap?: Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
export declare function designToProject(design: unknown, meta: {
|
|
54
|
+
id: string;
|
|
55
|
+
name: string;
|
|
56
|
+
createdAt?: string;
|
|
57
|
+
updatedAt?: string;
|
|
58
|
+
}): Project;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=designToProject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designToProject.d.ts","sourceRoot":"","sources":["../../../src/services/editor/designToProject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,8BAA8B,CAAC;AAGzE;;;;;;;;;;;GAWG;AAEH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,UAAU,iBAAkB,SAAQ,cAAc;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAoBD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,OAAO,EACf,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,OAAO,CA2ET"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.designToProject = designToProject;
|
|
4
|
+
const project_schema_1 = require("../../schemas/project.schema");
|
|
5
|
+
const TRACK_TYPE_TO_KIND = {
|
|
6
|
+
main: "video",
|
|
7
|
+
video: "video",
|
|
8
|
+
audio: "audio",
|
|
9
|
+
text: "text",
|
|
10
|
+
caption: "caption",
|
|
11
|
+
helper: "fx",
|
|
12
|
+
fx: "fx",
|
|
13
|
+
};
|
|
14
|
+
const ITEM_TYPE_TO_CLIP = {
|
|
15
|
+
video: "video",
|
|
16
|
+
image: "image",
|
|
17
|
+
audio: "audio",
|
|
18
|
+
text: "text",
|
|
19
|
+
caption: "caption",
|
|
20
|
+
};
|
|
21
|
+
function designToProject(design, meta) {
|
|
22
|
+
const d = (design ?? {});
|
|
23
|
+
const width = d.size?.width ?? 1080;
|
|
24
|
+
const height = d.size?.height ?? 1920;
|
|
25
|
+
const fps = d.fps ?? 30;
|
|
26
|
+
const aspect = inferAspect(width, height);
|
|
27
|
+
const now = new Date().toISOString();
|
|
28
|
+
const tracks = [];
|
|
29
|
+
for (const [i, t] of (d.tracks ?? []).entries()) {
|
|
30
|
+
if (!t || typeof t !== "object" || !t.id)
|
|
31
|
+
continue;
|
|
32
|
+
tracks.push({
|
|
33
|
+
id: t.id,
|
|
34
|
+
kind: TRACK_TYPE_TO_KIND[t.type] ?? "video",
|
|
35
|
+
index: typeof t.index === "number" ? t.index : i,
|
|
36
|
+
muted: false,
|
|
37
|
+
hidden: false,
|
|
38
|
+
locked: false,
|
|
39
|
+
gainDb: 0,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const trackIdByItem = new Map();
|
|
43
|
+
for (const t of d.tracks ?? []) {
|
|
44
|
+
for (const itemId of t.items ?? [])
|
|
45
|
+
trackIdByItem.set(itemId, t.id);
|
|
46
|
+
}
|
|
47
|
+
const clips = [];
|
|
48
|
+
const itemIds = d.trackItemIds ?? Object.keys(d.trackItemsMap ?? {});
|
|
49
|
+
for (const id of itemIds) {
|
|
50
|
+
const base = d.trackItemsMap?.[id];
|
|
51
|
+
const detailItem = d.trackItemDetailsMap?.[id];
|
|
52
|
+
if (!base)
|
|
53
|
+
continue;
|
|
54
|
+
const editorType = base.type ?? detailItem?.type;
|
|
55
|
+
const clipType = editorType ? ITEM_TYPE_TO_CLIP[editorType] : undefined;
|
|
56
|
+
if (!clipType)
|
|
57
|
+
continue;
|
|
58
|
+
const trackId = trackIdByItem.get(id);
|
|
59
|
+
if (!trackId)
|
|
60
|
+
continue;
|
|
61
|
+
const display = {
|
|
62
|
+
from: Math.max(0, Math.floor(base.display?.from ?? 0)),
|
|
63
|
+
to: Math.max(1, Math.floor(base.display?.to ?? 0)),
|
|
64
|
+
};
|
|
65
|
+
if (display.to <= display.from)
|
|
66
|
+
continue;
|
|
67
|
+
const clip = buildClip(id, trackId, clipType, base, detailItem, display, {
|
|
68
|
+
width,
|
|
69
|
+
height,
|
|
70
|
+
});
|
|
71
|
+
if (clip)
|
|
72
|
+
clips.push(clip);
|
|
73
|
+
}
|
|
74
|
+
const durationMs = typeof d.duration === "number" && d.duration > 0
|
|
75
|
+
? d.duration
|
|
76
|
+
: clips.reduce((acc, c) => Math.max(acc, c.display.to), 1);
|
|
77
|
+
return {
|
|
78
|
+
schemaVersion: project_schema_1.PROJECT_SCHEMA_VERSION,
|
|
79
|
+
id: meta.id,
|
|
80
|
+
name: meta.name,
|
|
81
|
+
durationMs,
|
|
82
|
+
fps,
|
|
83
|
+
size: { width, height },
|
|
84
|
+
aspect,
|
|
85
|
+
background: editorBackgroundToProject(d.background),
|
|
86
|
+
tracks,
|
|
87
|
+
clips,
|
|
88
|
+
transitions: [],
|
|
89
|
+
metadata: {},
|
|
90
|
+
createdAt: meta.createdAt ?? now,
|
|
91
|
+
updatedAt: meta.updatedAt ?? now,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function inferAspect(w, h) {
|
|
95
|
+
const r = w / h;
|
|
96
|
+
if (Math.abs(r - 9 / 16) < 0.05)
|
|
97
|
+
return "9:16";
|
|
98
|
+
if (Math.abs(r - 1) < 0.05)
|
|
99
|
+
return "1:1";
|
|
100
|
+
if (Math.abs(r - 4 / 5) < 0.05)
|
|
101
|
+
return "4:5";
|
|
102
|
+
return "16:9";
|
|
103
|
+
}
|
|
104
|
+
function editorBackgroundToProject(bg) {
|
|
105
|
+
if (!bg)
|
|
106
|
+
return { type: "color", value: "#000000" };
|
|
107
|
+
if (bg.type === "image" && bg.value)
|
|
108
|
+
return { type: "image", src: bg.value };
|
|
109
|
+
if (bg.type === "transparent")
|
|
110
|
+
return { type: "transparent" };
|
|
111
|
+
return { type: "color", value: bg.value ?? "#000000" };
|
|
112
|
+
}
|
|
113
|
+
function buildClip(id, trackId, type, base, detail, display, size) {
|
|
114
|
+
const details = (detail?.details ?? {});
|
|
115
|
+
const name = base.name ?? id;
|
|
116
|
+
const common = {
|
|
117
|
+
id,
|
|
118
|
+
trackId,
|
|
119
|
+
display,
|
|
120
|
+
name,
|
|
121
|
+
effects: [],
|
|
122
|
+
transform: { x: 0, y: 0, scaleX: 1, scaleY: 1, rotation: 0, opacity: 1 },
|
|
123
|
+
locked: false,
|
|
124
|
+
metadata: {},
|
|
125
|
+
};
|
|
126
|
+
const src = typeof details.src === "string" ? details.src : "";
|
|
127
|
+
switch (type) {
|
|
128
|
+
case "video":
|
|
129
|
+
if (!src)
|
|
130
|
+
return null;
|
|
131
|
+
return {
|
|
132
|
+
...common,
|
|
133
|
+
type: "video",
|
|
134
|
+
src,
|
|
135
|
+
volume: numOr(details.volume, 1),
|
|
136
|
+
playbackRate: 1,
|
|
137
|
+
};
|
|
138
|
+
case "image":
|
|
139
|
+
if (!src)
|
|
140
|
+
return null;
|
|
141
|
+
return { ...common, type: "image", src };
|
|
142
|
+
case "audio":
|
|
143
|
+
if (!src)
|
|
144
|
+
return null;
|
|
145
|
+
return {
|
|
146
|
+
...common,
|
|
147
|
+
type: "audio",
|
|
148
|
+
src,
|
|
149
|
+
volume: numOr(details.volume, 1),
|
|
150
|
+
fadeInMs: 0,
|
|
151
|
+
fadeOutMs: 0,
|
|
152
|
+
};
|
|
153
|
+
case "text": {
|
|
154
|
+
const text = strOr(details.text, "");
|
|
155
|
+
if (!text)
|
|
156
|
+
return null;
|
|
157
|
+
return {
|
|
158
|
+
...common,
|
|
159
|
+
type: "text",
|
|
160
|
+
text,
|
|
161
|
+
fontFamily: strOr(details.fontFamily, "Poppins"),
|
|
162
|
+
fontSize: numOr(details.fontSize, 48),
|
|
163
|
+
fontWeight: 700,
|
|
164
|
+
color: strOr(details.color, "#ffffff"),
|
|
165
|
+
align: "center",
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
case "caption": {
|
|
169
|
+
const text = strOr(details.text, "");
|
|
170
|
+
if (!text)
|
|
171
|
+
return null;
|
|
172
|
+
return {
|
|
173
|
+
...common,
|
|
174
|
+
type: "caption",
|
|
175
|
+
text,
|
|
176
|
+
words: [],
|
|
177
|
+
fontFamily: strOr(details.fontFamily, "Poppins"),
|
|
178
|
+
fontSize: numOr(details.fontSize, 48),
|
|
179
|
+
color: strOr(details.color, "#ffffff"),
|
|
180
|
+
language: "en",
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
default:
|
|
184
|
+
// exhaustive
|
|
185
|
+
void size;
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function numOr(v, def) {
|
|
190
|
+
return typeof v === "number" && Number.isFinite(v) ? v : def;
|
|
191
|
+
}
|
|
192
|
+
function strOr(v, def) {
|
|
193
|
+
return typeof v === "string" && v.length > 0 ? v : def;
|
|
194
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export * from "./musicSearchFactory.service";
|
|
3
|
+
export { CURATED_CATALOG, CuratedMusicProvider } from "./providers/curated.service";
|
|
4
|
+
export { JamendoMusicProvider } from "./providers/jamendo.service";
|
|
5
|
+
export { MubertMusicProvider } from "./providers/mubert.service";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/musicGen/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,8BAA8B,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.MubertMusicProvider = exports.JamendoMusicProvider = exports.CuratedMusicProvider = exports.CURATED_CATALOG = void 0;
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
__exportStar(require("./musicSearchFactory.service"), exports);
|
|
20
|
+
var curated_service_1 = require("./providers/curated.service");
|
|
21
|
+
Object.defineProperty(exports, "CURATED_CATALOG", { enumerable: true, get: function () { return curated_service_1.CURATED_CATALOG; } });
|
|
22
|
+
Object.defineProperty(exports, "CuratedMusicProvider", { enumerable: true, get: function () { return curated_service_1.CuratedMusicProvider; } });
|
|
23
|
+
var jamendo_service_1 = require("./providers/jamendo.service");
|
|
24
|
+
Object.defineProperty(exports, "JamendoMusicProvider", { enumerable: true, get: function () { return jamendo_service_1.JamendoMusicProvider; } });
|
|
25
|
+
var mubert_service_1 = require("./providers/mubert.service");
|
|
26
|
+
Object.defineProperty(exports, "MubertMusicProvider", { enumerable: true, get: function () { return mubert_service_1.MubertMusicProvider; } });
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MusicSearchParams, MusicSearchProvider, MusicSearchResult, MusicSource } from "./types";
|
|
2
|
+
export declare function getMusicSearchProvider(source: MusicSource): MusicSearchProvider;
|
|
3
|
+
export declare function listAvailableMusicSources(): MusicSource[];
|
|
4
|
+
/**
|
|
5
|
+
* Walk providers in priority order; stop at the first one that returns a
|
|
6
|
+
* track. Skips providers that aren't configured. Caller chooses one of the
|
|
7
|
+
* tracks — usually the first.
|
|
8
|
+
*/
|
|
9
|
+
export declare function searchAllMusicSources(params: MusicSearchParams, opts?: {
|
|
10
|
+
preferred?: MusicSource;
|
|
11
|
+
}): Promise<MusicSearchResult & {
|
|
12
|
+
sourceUsed?: MusicSource;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=musicSearchFactory.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"musicSearchFactory.service.d.ts","sourceRoot":"","sources":["../../../src/services/musicGen/musicSearchFactory.service.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACZ,MAAM,SAAS,CAAC;AA4BjB,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,mBAAmB,CAI/E;AAED,wBAAgB,yBAAyB,IAAI,WAAW,EAAE,CAEzD;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,iBAAiB,EACzB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,OAAO,CAAC,iBAAiB,GAAG;IAAE,UAAU,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC,CAY3D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMusicSearchProvider = getMusicSearchProvider;
|
|
4
|
+
exports.listAvailableMusicSources = listAvailableMusicSources;
|
|
5
|
+
exports.searchAllMusicSources = searchAllMusicSources;
|
|
6
|
+
const curated_service_1 = require("./providers/curated.service");
|
|
7
|
+
const jamendo_service_1 = require("./providers/jamendo.service");
|
|
8
|
+
const mubert_service_1 = require("./providers/mubert.service");
|
|
9
|
+
/**
|
|
10
|
+
* Factory + multi-source dispatcher for music search.
|
|
11
|
+
*
|
|
12
|
+
* Resolution rules:
|
|
13
|
+
* - When a specific source is requested, return its provider (even if not
|
|
14
|
+
* available — caller can branch on isAvailable() for clearer errors).
|
|
15
|
+
* - `searchAll(params)` walks the priority list (curated → jamendo → mubert)
|
|
16
|
+
* and returns the first non-empty result. Curated is always first because
|
|
17
|
+
* it ships zero-latency, zero-cost; Mubert is last because it generates
|
|
18
|
+
* and bills per call.
|
|
19
|
+
*/
|
|
20
|
+
const PRIORITY = ["curated", "jamendo", "mubert"];
|
|
21
|
+
let providerCache;
|
|
22
|
+
function providers() {
|
|
23
|
+
if (providerCache)
|
|
24
|
+
return providerCache;
|
|
25
|
+
providerCache = new Map([
|
|
26
|
+
["curated", new curated_service_1.CuratedMusicProvider()],
|
|
27
|
+
["jamendo", new jamendo_service_1.JamendoMusicProvider()],
|
|
28
|
+
["mubert", new mubert_service_1.MubertMusicProvider()],
|
|
29
|
+
]);
|
|
30
|
+
return providerCache;
|
|
31
|
+
}
|
|
32
|
+
function getMusicSearchProvider(source) {
|
|
33
|
+
const p = providers().get(source);
|
|
34
|
+
if (!p)
|
|
35
|
+
throw new Error(`Unknown music source: ${source}`);
|
|
36
|
+
return p;
|
|
37
|
+
}
|
|
38
|
+
function listAvailableMusicSources() {
|
|
39
|
+
return PRIORITY.filter((s) => providers().get(s)?.isAvailable());
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Walk providers in priority order; stop at the first one that returns a
|
|
43
|
+
* track. Skips providers that aren't configured. Caller chooses one of the
|
|
44
|
+
* tracks — usually the first.
|
|
45
|
+
*/
|
|
46
|
+
async function searchAllMusicSources(params, opts = {}) {
|
|
47
|
+
const order = opts.preferred
|
|
48
|
+
? [opts.preferred, ...PRIORITY.filter((s) => s !== opts.preferred)]
|
|
49
|
+
: PRIORITY;
|
|
50
|
+
for (const source of order) {
|
|
51
|
+
const provider = providers().get(source);
|
|
52
|
+
if (!provider?.isAvailable())
|
|
53
|
+
continue;
|
|
54
|
+
const result = await provider.search(params);
|
|
55
|
+
if (result.tracks.length)
|
|
56
|
+
return { ...result, sourceUsed: source };
|
|
57
|
+
}
|
|
58
|
+
return { tracks: [] };
|
|
59
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { MusicSearchParams, MusicSearchProvider, MusicSearchResult, MusicTrack } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Curated CC0 music catalog — always-on, zero-config, zero licensing risk.
|
|
4
|
+
*
|
|
5
|
+
* Seeded with a small spread across the moods/BPMs the 5 personas actually
|
|
6
|
+
* ask for. Tracks live in our own GCS bucket so we control availability and
|
|
7
|
+
* never lose the source. Hand-verified BPM means slice-1 (BPM snap) and
|
|
8
|
+
* slice-3 (onset detection) both have a reliable starting point.
|
|
9
|
+
*
|
|
10
|
+
* Add new tracks by appending to CURATED_CATALOG. Re-deploys pick them up
|
|
11
|
+
* immediately — no DB migration, no provider re-init.
|
|
12
|
+
*
|
|
13
|
+
* Sourcing rule for additions: CC0 / Pixabay license / FMA "no rights
|
|
14
|
+
* reserved" only. No CC-BY without an attribution surface in the UI first.
|
|
15
|
+
*/
|
|
16
|
+
export declare const CURATED_CATALOG: MusicTrack[];
|
|
17
|
+
export declare class CuratedMusicProvider implements MusicSearchProvider {
|
|
18
|
+
readonly source: "curated";
|
|
19
|
+
isAvailable(): boolean;
|
|
20
|
+
search(params: MusicSearchParams): Promise<MusicSearchResult>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=curated.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curated.service.d.ts","sourceRoot":"","sources":["../../../../src/services/musicGen/providers/curated.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACX,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,eAAe,EAAE,UAAU,EAiFvC,CAAC;AAsDF,qBAAa,oBAAqB,YAAW,mBAAmB;IAC9D,QAAQ,CAAC,MAAM,EAAG,SAAS,CAAU;IACrC,WAAW,IAAI,OAAO;IAIhB,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAUpE"}
|