feat: MusicBrainz BPM enrichment + improved AI prompts
- lookupRecordingWithTags, extractBpmFromTags, extractTimeSigFromTags, getMusicBrainzRecording added to MB client - upsertSong preserves existing BPM via COALESCE on conflict - updateSongBpm helper for async enrichment writes - AnalysisInput gains confirmedBpm / confirmedTimeSigNum fields - POST /api/analyze fetches confirmed BPM from DB then MB tags before generation - All three AI providers use confirmedBpm as authoritative and build enriched userMessage - POST /api/tracks auto-registration now fetches tags via getMusicBrainzRecording - Updated User-Agent and MB client fallback URL to Gitea Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -96,13 +96,22 @@ export const ollamaProvider: AnalysisProvider = {
|
||||
},
|
||||
|
||||
async generateCTP(input: AnalysisInput): Promise<CTPDocument> {
|
||||
const { ollamaModel, bpm, duration, title, artist, mbid, contributed_by } = input;
|
||||
const { ollamaModel, bpm, duration, title, artist, mbid, contributed_by, confirmedBpm, confirmedTimeSigNum } = input;
|
||||
|
||||
if (!ollamaModel) {
|
||||
throw new Error("ollamaModel is required for Ollama provider");
|
||||
}
|
||||
|
||||
const approxBars = Math.round((duration * bpm) / 60 / 4);
|
||||
const effectiveBpm = confirmedBpm ?? bpm;
|
||||
const approxBars = Math.round((duration * effectiveBpm) / 60 / 4);
|
||||
|
||||
const bpmLine = confirmedBpm
|
||||
? `Confirmed BPM (from MusicBrainz community tags — treat as authoritative): ${confirmedBpm}\nDetected BPM (audio analysis): ${bpm}`
|
||||
: `Detected BPM (audio analysis): ${bpm}`;
|
||||
|
||||
const timeSigHint = confirmedTimeSigNum
|
||||
? `\nConfirmed time signature numerator: ${confirmedTimeSigNum}`
|
||||
: "";
|
||||
|
||||
const userMessage = `\
|
||||
Generate a CTP document for the following song:
|
||||
@@ -110,11 +119,11 @@ Generate a CTP document for the following song:
|
||||
Title: ${title ?? "Unknown Title"}
|
||||
Artist: ${artist ?? "Unknown Artist"}
|
||||
MusicBrainz ID: ${mbid ?? "unknown"}
|
||||
Detected BPM: ${bpm}
|
||||
${bpmLine}${timeSigHint}
|
||||
Duration: ${duration.toFixed(1)} seconds (~${approxBars} bars at 4/4)
|
||||
Contributed by: ${contributed_by}
|
||||
|
||||
Create a plausible section layout for this song. If this is a well-known song, use your knowledge of its actual arrangement. If not, use a sensible generic structure.`;
|
||||
If you recognise this song, use your training knowledge of its actual arrangement — section names, bar counts, time signature, and any tempo changes. If you do not recognise it, use a sensible generic structure based on the BPM and duration above.`;
|
||||
|
||||
// Attempt parse with one retry on failure
|
||||
let content: string;
|
||||
|
||||
Reference in New Issue
Block a user