From a3dc4f89b713eb71eec86a56ff655c1aba156851 Mon Sep 17 00:00:00 2001 From: Thomas Demirdjian Date: Mon, 8 Sep 2025 15:48:29 +0200 Subject: [PATCH] filter on lyrics for bloking unwanted content, tickets fix --- AGENTS.md | 42 ++ firebase-debug.log | 831 +++++++++++++++++++++++ functions/helpers/gemini.js | 140 +++- functions/src/lyrics.js | 57 +- functions/src/music.js | 132 +++- src/config/firebase.js | 6 +- src/screens/Library/AllMyList.js | 2 +- src/screens/Production/DownloadPrices.js | 2 +- src/screens/Production/SongDownloaded.js | 2 +- src/screens/Production/SongRelease.js | 2 +- src/screens/Production/StreamSong.js | 2 +- src/screens/Studio/ChooseRhythm.js | 9 +- src/screens/Studio/ComposeSong.js | 18 +- src/screens/Studio/CustomizeVoice.js | 33 +- src/screens/Studio/GeneratingSong.js | 82 ++- src/screens/Studio/Regenerate.js | 2 +- src/screens/Writing/EmotionConvey.js | 7 +- src/screens/Writing/Goals.js | 11 +- src/screens/Writing/Lyrics.js | 106 ++- src/screens/Writing/Rhymes.js | 10 +- src/screens/Writing/SongStructure.js | 8 +- src/screens/Writing/SongStyle.js | 8 +- 22 files changed, 1386 insertions(+), 126 deletions(-) create mode 100644 AGENTS.md create mode 100644 firebase-debug.log diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5b9c91d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,42 @@ +# Repository Guidelines + +## Project Structure & Module Organization +- Entry points: `App.js`, `index.js`, `index.web.js`. +- Source code: `src/` (key folders: `actions/`, `components/`, `hooks/`, `screens/`, `providers/`, `navigation/`, `utils/`, `styles/`, `assets/`). +- Native projects: `android/`, `ios/`. +- Assets: `assets/` and `src/assets/`. +- Config: `app.json`, `eas.json`, `metro.config.js`, `config/`. +- Backend: `functions/` (Firebase Cloud Functions, Node 20). + +## Build, Test, and Development Commands +- Install deps: `yarn` (preferred; lockfile is `yarn.lock`). +- Run app: `yarn start` (Expo dev client), `yarn android`, `yarn ios`, `yarn web`. +- Clean native builds: `yarn clean` (runs `expo prebuild --clean`). +- Web build: `yarn build:web` → outputs to `dist/`. +- Desktop (pake): `yarn build:desktop:dev` (requires dev server), `yarn build:desktop:prod`. +- Firebase functions: `cd functions && npm run serve` (emulators), `npm run deploy`. + +## Coding Style & Naming Conventions +- Languages: React Native (JS/TS). Indentation: 2 spaces. +- Lint/format: ESLint (`expo`, `prettier`) + Prettier. Keep code formatted; fix all lint errors. + - Example: `npx eslint src`. +- Components and screens: PascalCase filenames, e.g., `MusicDetails.js`, `CreateLyricsWithAi.js`. +- Hooks: prefix with `use` (e.g., `src/hooks/useFirestorePagination.js`). +- Utilities: lowerCamelCase modules in `src/utils/` or `helpers/`; prefer named exports. +- Avoid duplicating inline styles; share via `src/styles/`. + +## Testing Guidelines +- No unit tests configured yet. If adding tests, prefer Jest + `@testing-library/react-native`. +- Place tests under `src/**/__tests__/` or as `*.test.[jt]sx` near sources. +- Until tests exist, include manual test steps in PRs (platform, device, steps, expected results). + +## Commit & Pull Request Guidelines +- Commits: concise, imperative subject (≤72 chars). Optional scope, e.g., `feat(login): add Google button`. +- PRs must include: clear description, screenshots/video for UI changes, reproduction and verification steps, linked issues, and notes on breaking changes. +- Verify the app launches on Android, iOS, and Web locally; fix lint and type warnings before requesting review. + +## Security & Configuration Tips +- Never commit secrets (e.g., `functions/serviceAccountKey.json`, API keys). Use Firebase/Expo secrets and environment config. +- Manage runtime config via `app.json`/`eas.json` or remote config; avoid hardcoding credentials. +- Before EAS builds, run `yarn clean` to resync native projects. + diff --git a/firebase-debug.log b/firebase-debug.log new file mode 100644 index 0000000..426d91c --- /dev/null +++ b/firebase-debug.log @@ -0,0 +1,831 @@ +[debug] [2025-09-08T11:30:00.226Z] ---------------------------------------------------------------------- +[debug] [2025-09-08T11:30:00.228Z] Command: /opt/homebrew/Cellar/node/24.1.0/bin/node /Users/thomasdemirdjian/.npm-global/bin/firebase emulators:start --only functions +[debug] [2025-09-08T11:30:00.228Z] CLI Version: 14.15.2 +[debug] [2025-09-08T11:30:00.228Z] Platform: darwin +[debug] [2025-09-08T11:30:00.228Z] Node Version: v24.1.0 +[debug] [2025-09-08T11:30:00.228Z] Time: Mon Sep 08 2025 13:30:00 GMT+0200 (Central European Summer Time) +[debug] [2025-09-08T11:30:00.228Z] ---------------------------------------------------------------------- +[debug] +[debug] [2025-09-08T11:30:00.310Z] Object "" in "firebase.json" has unknown property: {"additionalProperty":"react-native"} +[debug] [2025-09-08T11:30:00.313Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"] +[debug] [2025-09-08T11:30:00.313Z] > authorizing via signed-in user (tdtomthomas@gmail.com) +[info] i emulators: Starting emulators: functions {"metadata":{"emulator":{"name":"hub"},"message":"Starting emulators: functions"}} +[debug] [2025-09-08T11:30:00.759Z] [logging] Logging Emulator only supports listening on one address (127.0.0.1). Not listening on ::1 +[debug] [2025-09-08T11:30:00.759Z] assigned listening specs for emulators {"user":{"hub":[{"address":"127.0.0.1","family":"IPv4","port":4400},{"address":"::1","family":"IPv6","port":4400}],"ui":[{"address":"127.0.0.1","family":"IPv4","port":4000},{"address":"::1","family":"IPv6","port":4000}],"logging":[{"address":"127.0.0.1","family":"IPv4","port":4500}]},"metadata":{"message":"assigned listening specs for emulators"}} +[debug] [2025-09-08T11:30:00.761Z] [hub] writing locator at /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/hub-musicland-d33f9.json +[debug] [2025-09-08T11:30:01.193Z] [functions] Functions Emulator only supports listening on one address (127.0.0.1). Not listening on ::1 +[debug] [2025-09-08T11:30:01.193Z] [eventarc] Eventarc Emulator only supports listening on one address (127.0.0.1). Not listening on ::1 +[debug] [2025-09-08T11:30:01.193Z] [tasks] Cloud Tasks Emulator only supports listening on one address (127.0.0.1). Not listening on ::1 +[debug] [2025-09-08T11:30:01.194Z] late-assigned ports for functions and eventarc emulators {"user":{"hub":[{"address":"127.0.0.1","family":"IPv4","port":4400},{"address":"::1","family":"IPv6","port":4400}],"ui":[{"address":"127.0.0.1","family":"IPv4","port":4000},{"address":"::1","family":"IPv6","port":4000}],"logging":[{"address":"127.0.0.1","family":"IPv4","port":4500}],"functions":[{"address":"127.0.0.1","family":"IPv4","port":5001}],"eventarc":[{"address":"127.0.0.1","family":"IPv4","port":9299}],"tasks":[{"address":"127.0.0.1","family":"IPv4","port":9499}]},"metadata":{"message":"late-assigned ports for functions and eventarc emulators"}} +[warn] ⚠ functions: The following emulators are not running, calls to these services from the Functions emulator will affect production: apphosting, auth, firestore, database, hosting, pubsub, storage, dataconnect {"metadata":{"emulator":{"name":"functions"},"message":"The following emulators are not running, calls to these services from the Functions emulator will affect production: \u001b[1mapphosting, auth, firestore, database, hosting, pubsub, storage, dataconnect\u001b[22m"}} +[debug] [2025-09-08T11:30:01.199Z] defaultcredentials: writing to file /Users/thomasdemirdjian/.config/firebase/tdtomthomas_gmail_com_application_default_credentials.json +[debug] [2025-09-08T11:30:01.200Z] Setting GAC to /Users/thomasdemirdjian/.config/firebase/tdtomthomas_gmail_com_application_default_credentials.json {"metadata":{"emulator":{"name":"functions"},"message":"Setting GAC to /Users/thomasdemirdjian/.config/firebase/tdtomthomas_gmail_com_application_default_credentials.json"}} +[debug] [2025-09-08T11:30:01.200Z] Checked if tokens are valid: false, expires at: 1757330753427 +[debug] [2025-09-08T11:30:01.200Z] Checked if tokens are valid: false, expires at: 1757330753427 +[debug] [2025-09-08T11:30:01.200Z] > refreshing access token with scopes: [] +[debug] [2025-09-08T11:30:01.201Z] >>> [apiv2][query] POST https://www.googleapis.com/oauth2/v3/token [none] +[debug] [2025-09-08T11:30:01.201Z] >>> [apiv2][body] POST https://www.googleapis.com/oauth2/v3/token [omitted] +[debug] [2025-09-08T11:30:01.320Z] <<< [apiv2][status] POST https://www.googleapis.com/oauth2/v3/token 200 +[debug] [2025-09-08T11:30:01.320Z] <<< [apiv2][body] POST https://www.googleapis.com/oauth2/v3/token [omitted] +[debug] [2025-09-08T11:30:01.340Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/musicland-d33f9/adminSdkConfig [none] +[debug] [2025-09-08T11:30:01.828Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/musicland-d33f9/adminSdkConfig 200 +[debug] [2025-09-08T11:30:01.828Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/musicland-d33f9/adminSdkConfig {"projectId":"musicland-d33f9","storageBucket":"musicland-d33f9.firebasestorage.app"} +[info] i functions: Watching "/Users/thomasdemirdjian/Minuit/musicland/functions" for Cloud Functions... {"metadata":{"emulator":{"name":"functions"},"message":"Watching \"/Users/thomasdemirdjian/Minuit/musicland/functions\" for Cloud Functions..."}} +[debug] [2025-09-08T11:30:01.865Z] Validating nodejs source +[debug] [2025-09-08T11:30:02.288Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T11:30:02.288Z] Building nodejs source +[debug] [2025-09-08T11:30:02.289Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T11:30:02.290Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T11:30:02.293Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8363 + +[debug] [2025-09-08T11:30:02.781Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[info] ✔ functions[us-central1-music-generateMusic]: http function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-generateMusic). {"metadata":{"emulator":{"name":"functions"},"message":"\u001b[1mhttp\u001b[22m function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-generateMusic)."}} +[info] ✔ functions[us-central1-music-getSunoStatus]: http function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-getSunoStatus). {"metadata":{"emulator":{"name":"functions"},"message":"\u001b[1mhttp\u001b[22m function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-getSunoStatus)."}} +[info] ✔ functions[us-central1-music-getSunoTimestamps]: http function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-getSunoTimestamps). {"metadata":{"emulator":{"name":"functions"},"message":"\u001b[1mhttp\u001b[22m function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-getSunoTimestamps)."}} +[info] ✔ functions[us-central1-music-sunoCallback]: http function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-sunoCallback). {"metadata":{"emulator":{"name":"functions"},"message":"\u001b[1mhttp\u001b[22m function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/music-sunoCallback)."}} +[info] ✔ functions[us-central1-lyrics-generateLyrics]: http function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/lyrics-generateLyrics). {"metadata":{"emulator":{"name":"functions"},"message":"\u001b[1mhttp\u001b[22m function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/lyrics-generateLyrics)."}} +[info] ✔ functions[us-central1-lyrics-analyseLyricsToxicity]: http function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity). {"metadata":{"emulator":{"name":"functions"},"message":"\u001b[1mhttp\u001b[22m function initialized (http://127.0.0.1:5001/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity)."}} +[info] i functions[us-central1-cover-onTaskCreateGenerateCover]: function ignored because the firestore emulator does not exist or is not running. {"metadata":{"emulator":{"name":"functions"},"message":"function ignored because the firestore emulator does not exist or is not running."}} +[debug] [2025-09-08T11:30:06.816Z] Could not find VSCode notification endpoint: FetchError: request to http://localhost:40001/vscode/notify failed, reason: . If you are not running the Firebase Data Connect VSCode extension, this is expected and not an issue. +[info] +┌─────────────────────────────────────────────────────────────┐ +│ ✔ All emulators ready! It is now safe to connect your app. │ +│ i View Emulator UI at http://127.0.0.1:4000/ │ +└─────────────────────────────────────────────────────────────┘ + +┌───────────┬────────────────┬─────────────────────────────────┐ +│ Emulator │ Host:Port │ View in Emulator UI │ +├───────────┼────────────────┼─────────────────────────────────┤ +│ Functions │ 127.0.0.1:5001 │ http://127.0.0.1:4000/functions │ +└───────────┴────────────────┴─────────────────────────────────┘ + Emulator Hub host: 127.0.0.1 port: 4400 + Other reserved ports: 4500 + +Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files. + +[debug] [2025-09-08T11:36:18.190Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers"}} +[debug] [2025-09-08T11:36:19.192Z] Validating nodejs source +[debug] [2025-09-08T11:36:19.490Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T11:36:19.490Z] Building nodejs source +[debug] [2025-09-08T11:36:19.490Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T11:36:19.490Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T11:36:19.491Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8371 + +[debug] [2025-09-08T11:36:19.710Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[debug] [2025-09-08T11:49:20.766Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers"}} +[debug] [2025-09-08T11:49:20.868Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers"}} +[debug] [2025-09-08T11:49:21.870Z] Validating nodejs source +[debug] [2025-09-08T11:49:22.292Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T11:49:22.292Z] Building nodejs source +[debug] [2025-09-08T11:49:22.292Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T11:49:22.293Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T11:49:22.295Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8552 + +[debug] [2025-09-08T11:49:22.732Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[debug] [2025-09-08T11:49:23.905Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/helpers/gemini.js changed, reloading triggers"}} +[debug] [2025-09-08T11:49:24.906Z] Validating nodejs source +[debug] [2025-09-08T11:49:25.204Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T11:49:25.204Z] Building nodejs source +[debug] [2025-09-08T11:49:25.204Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T11:49:25.204Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T11:49:25.205Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8001 + +[debug] [2025-09-08T11:49:25.422Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[debug] [2025-09-08T11:49:59.030Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:49:59.030Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T11:49:59.030Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:49:59.030Z"],"workRunningCount":1} +[debug] [2025-09-08T11:49:59.030Z] Accepted request POST /musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity --> us-central1-lyrics-analyseLyricsToxicity +[debug] [2025-09-08T11:49:59.038Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T11:49:59.039Z] [functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/"}} +[debug] [2025-09-08T11:49:59.044Z] [worker-pool] addWorker(us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] addWorker(us-central1-lyrics-analyseLyricsToxicity)"}} +[debug] [2025-09-08T11:49:59.045Z] [worker-pool] Adding worker with key us-central1-lyrics-analyseLyricsToxicity, total=1 {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Adding worker with key us-central1-lyrics-analyseLyricsToxicity, total=1"}} +[debug] [2025-09-08T11:49:59.470Z] [runtime-status] [77309] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T11:49:59.470Z] [runtime-status] [77309] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T11:49:59.470Z] [runtime-status] [77309] Outgoing network have been stubbed. [{"name":"http","status":"mocked"},{"name":"http","status":"mocked"},{"name":"https","status":"mocked"},{"name":"https","status":"mocked"},{"name":"net","status":"mocked"}] {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Outgoing network have been stubbed. [{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"net\",\"status\":\"mocked\"}]"}} +[debug] [2025-09-08T11:49:59.470Z] [runtime-status] [77309] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T11:49:59.534Z] [runtime-status] [77309] Checked functions.config() {"config":{}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Checked functions.config() {\"config\":{}}"}} +[debug] [2025-09-08T11:49:59.534Z] [runtime-status] [77309] firebase-functions has been stubbed. {"functionsResolution":{"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] firebase-functions has been stubbed. {\"functionsResolution\":{\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}}"}} +[debug] [2025-09-08T11:49:59.534Z] [runtime-status] [77309] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T11:49:59.536Z] [runtime-status] [77309] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T11:49:59.536Z] [runtime-status] [77309] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T11:49:59.536Z] [runtime-status] [77309] firebase-admin has been stubbed. {"adminResolution":{"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] firebase-admin has been stubbed. {\"adminResolution\":{\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}}"}} +[debug] [2025-09-08T11:49:59.537Z] [runtime-status] [77309] initializeApp(DEFAULT) {"storageBucket":"musicland-d33f9.firebasestorage.app","projectId":"musicland-d33f9"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] initializeApp(DEFAULT) {\"storageBucket\":\"musicland-d33f9.firebasestorage.app\",\"projectId\":\"musicland-d33f9\"}"}} +[warn] ⚠ functions: The Cloud Firestore emulator is not running, so calls to Firestore will affect production. {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"The Cloud Firestore emulator is not running, so calls to Firestore will affect production."}} +[debug] [2025-09-08T11:49:59.649Z] [runtime-status] [77309] Functions runtime initialized. {"cwd":"/Users/thomasdemirdjian/Minuit/musicland/functions","node_version":"24.1.0"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Functions runtime initialized. {\"cwd\":\"/Users/thomasdemirdjian/Minuit/musicland/functions\",\"node_version\":\"24.1.0\"}"}} +[debug] [2025-09-08T11:49:59.649Z] [runtime-status] [77309] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_04364927232a9fd0.sock {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [77309] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_04364927232a9fd0.sock"}} +[debug] [2025-09-08T11:49:59.655Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE"}} +[debug] [2025-09-08T11:49:59.655Z] [worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity)"}} +[info] i functions: Beginning execution of "us-central1-lyrics-analyseLyricsToxicity" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Beginning execution of \"us-central1-lyrics-analyseLyricsToxicity\""}} +[debug] [2025-09-08T11:49:59.655Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[debug] [2025-09-08T11:50:06.588Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-lyrics-analyseLyricsToxicity" in 6932.631917ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finished \"us-central1-lyrics-analyseLyricsToxicity\" in 6932.631917ms"}} +[debug] [2025-09-08T11:50:06.588Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE"}} +[debug] [2025-09-08T11:50:06.588Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T11:50:06.588Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T11:50:06.588Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T11:50:49.715Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:50:49.715Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T11:50:49.715Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:50:49.715Z"],"workRunningCount":1} +[debug] [2025-09-08T11:50:49.715Z] Accepted request POST /musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity --> us-central1-lyrics-analyseLyricsToxicity +[debug] [2025-09-08T11:50:49.717Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T11:50:49.719Z] [functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/"}} +[debug] [2025-09-08T11:50:49.719Z] [worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity)"}} +[info] i functions: Beginning execution of "us-central1-lyrics-analyseLyricsToxicity" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Beginning execution of \"us-central1-lyrics-analyseLyricsToxicity\""}} +[debug] [2025-09-08T11:50:49.719Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[debug] [2025-09-08T11:50:57.088Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-lyrics-analyseLyricsToxicity" in 7372.177333ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finished \"us-central1-lyrics-analyseLyricsToxicity\" in 7372.177333ms"}} +[debug] [2025-09-08T11:50:57.092Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE"}} +[debug] [2025-09-08T11:50:57.092Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T11:50:57.093Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T11:50:57.093Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T11:51:10.560Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:51:10.560Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T11:51:10.560Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:51:10.560Z"],"workRunningCount":1} +[debug] [2025-09-08T11:51:10.560Z] Accepted request POST /musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity --> us-central1-lyrics-analyseLyricsToxicity +[debug] [2025-09-08T11:51:10.561Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T11:51:10.561Z] [functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/"}} +[debug] [2025-09-08T11:51:10.561Z] [worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity)"}} +[info] i functions: Beginning execution of "us-central1-lyrics-analyseLyricsToxicity" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Beginning execution of \"us-central1-lyrics-analyseLyricsToxicity\""}} +[debug] [2025-09-08T11:51:10.562Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[debug] [2025-09-08T11:51:19.240Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-lyrics-analyseLyricsToxicity" in 8678.713042ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finished \"us-central1-lyrics-analyseLyricsToxicity\" in 8678.713042ms"}} +[debug] [2025-09-08T11:51:19.241Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE"}} +[debug] [2025-09-08T11:51:19.241Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T11:51:19.241Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T11:51:19.241Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T11:53:19.130Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:53:19.130Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T11:53:19.130Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T11:53:19.130Z"],"workRunningCount":1} +[debug] [2025-09-08T11:53:19.130Z] Accepted request POST /musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity --> us-central1-lyrics-analyseLyricsToxicity +[debug] [2025-09-08T11:53:19.134Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T11:53:19.134Z] [functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/"}} +[debug] [2025-09-08T11:53:19.134Z] [worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity)"}} +[info] i functions: Beginning execution of "us-central1-lyrics-analyseLyricsToxicity" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Beginning execution of \"us-central1-lyrics-analyseLyricsToxicity\""}} +[debug] [2025-09-08T11:53:19.135Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[debug] [2025-09-08T11:53:41.019Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-lyrics-analyseLyricsToxicity" in 21884.955625ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finished \"us-central1-lyrics-analyseLyricsToxicity\" in 21884.955625ms"}} +[debug] [2025-09-08T11:53:41.020Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: IDLE"}} +[debug] [2025-09-08T11:53:41.020Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T11:53:41.020Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T11:53:41.021Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T12:24:57.073Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers"}} +[debug] [2025-09-08T12:24:58.075Z] Validating nodejs source +[debug] [2025-09-08T12:24:58.547Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T12:24:58.547Z] Building nodejs source +[debug] [2025-09-08T12:24:58.548Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T12:24:58.548Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T12:24:58.549Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8404 + +[debug] [2025-09-08T12:24:59.004Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[debug] [2025-09-08T12:25:03.021Z] [worker-pool] Shutting down IDLE worker (us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Shutting down IDLE worker (us-central1-lyrics-analyseLyricsToxicity)"}} +[debug] [2025-09-08T12:25:03.022Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: FINISHING {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: FINISHING"}} +[info] > Shutting down all Genkit servers... {"user":"Shutting down all Genkit servers...","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"\u001b[90m> \u001b[39m Shutting down all Genkit servers..."}} +[debug] [2025-09-08T12:25:03.032Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: exited {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: exited"}} +[debug] [2025-09-08T12:25:03.032Z] [worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: FINISHED {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-fa55f49a-7546-4632-a999-b93285b9a561]: FINISHED"}} +[debug] [2025-09-08T12:26:25.144Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers"}} +[debug] [2025-09-08T12:26:26.146Z] Validating nodejs source +[debug] [2025-09-08T12:26:26.442Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T12:26:26.443Z] Building nodejs source +[debug] [2025-09-08T12:26:26.443Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T12:26:26.443Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T12:26:26.444Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8689 + +[debug] [2025-09-08T12:26:26.684Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[debug] [2025-09-08T12:27:08.867Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers"}} +[debug] [2025-09-08T12:27:08.968Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers"}} +[debug] [2025-09-08T12:27:09.970Z] Validating nodejs source +[debug] [2025-09-08T12:27:10.266Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T12:27:10.266Z] Building nodejs source +[debug] [2025-09-08T12:27:10.266Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T12:27:10.267Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T12:27:10.267Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8979 + +[debug] [2025-09-08T12:27:10.478Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[debug] [2025-09-08T12:32:29.225Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers"}} +[debug] [2025-09-08T12:32:30.226Z] Validating nodejs source +[debug] [2025-09-08T12:32:30.548Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T12:32:30.548Z] Building nodejs source +[debug] [2025-09-08T12:32:30.548Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T12:32:30.548Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T12:32:30.549Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8143 + +[debug] [2025-09-08T12:32:30.776Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[debug] [2025-09-08T12:32:33.479Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers"}} +[debug] [2025-09-08T12:32:34.481Z] Validating nodejs source +[debug] [2025-09-08T12:32:34.788Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T12:32:34.789Z] Building nodejs source +[debug] [2025-09-08T12:32:34.789Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T12:32:34.789Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T12:32:34.790Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[info] Serving at port 8400 + +[debug] [2025-09-08T12:32:35.036Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[debug] [2025-09-08T12:50:55.377Z] File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers {"metadata":{"emulator":{"name":"functions"},"message":"File /Users/thomasdemirdjian/Minuit/musicland/functions/src/music.js changed, reloading triggers"}} +[debug] [2025-09-08T12:50:56.379Z] Validating nodejs source +[debug] [2025-09-08T12:50:56.820Z] > [functions] package.json contents: { + "name": "functions", + "description": "Cloud Functions for Firebase", + "scripts": { + "lint": "eslint .", + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "20" + }, + "main": "index.js", + "dependencies": { + "@genkit-ai/googleai": "^1.18.0", + "axios": "^1.11.0", + "firebase-admin": "^12.7.0", + "firebase-functions": "^6.4.0", + "genkit": "^1.18.0" + }, + "devDependencies": { + "eslint": "^8.15.0", + "eslint-config-google": "^0.14.0" + }, + "private": true +} +[debug] [2025-09-08T12:50:56.820Z] Building nodejs source +[debug] [2025-09-08T12:50:56.820Z] Failed to find version of module node: reached end of search path /Users/thomasdemirdjian/Minuit/musicland/functions/node_modules +[warn] ⚠ functions: Your requested "node" version "20" doesn't match your global version "24". Using node@24 from host. +[debug] [2025-09-08T12:50:56.820Z] Could not find functions.yaml. Must use http discovery +[debug] [2025-09-08T12:50:56.821Z] Found firebase-functions binary at '/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/.bin/firebase-functions' +[info] Serving at port 8655 + +[debug] [2025-09-08T12:50:57.317Z] Got response from /__/functions.yaml {"endpoints":{"music-generateMusic":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.generateMusic"},"music-getSunoStatus":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoStatus"},"music-getSunoTimestamps":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"music.getSunoTimestamps"},"music-sunoCallback":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"httpsTrigger":{},"entryPoint":"music.sunoCallback"},"lyrics-generateLyrics":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.generateLyrics"},"lyrics-analyseLyricsToxicity":{"availableMemoryMb":null,"timeoutSeconds":null,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"callableTrigger":{},"entryPoint":"lyrics.analyseLyricsToxicity"},"cover-onTaskCreateGenerateCover":{"availableMemoryMb":1024,"timeoutSeconds":540,"minInstances":null,"maxInstances":null,"ingressSettings":null,"concurrency":null,"serviceAccountEmail":null,"vpc":null,"platform":"gcfv2","labels":{},"eventTrigger":{"eventType":"google.cloud.firestore.document.v1.created","eventFilters":{"database":"(default)","namespace":"(default)"},"eventFilterPathPatterns":{"document":"tasks/{taskId}"},"retry":false},"entryPoint":"cover.onTaskCreateGenerateCover"}},"specVersion":"v1alpha1","requiredAPIs":[],"extensions":{}} +[info] ✔ functions: Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover. {"metadata":{"emulator":{"name":"functions"},"message":"Loaded functions definitions from source: music.generateMusic, music.getSunoStatus, music.getSunoTimestamps, music.sunoCallback, lyrics.generateLyrics, lyrics.analyseLyricsToxicity, cover.onTaskCreateGenerateCover."}} +[debug] [2025-09-08T12:57:11.410Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/music-generateMusic-2025-09-08T12:57:11.410Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T12:57:11.410Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/music-generateMusic-2025-09-08T12:57:11.410Z"],"workRunningCount":1} +[debug] [2025-09-08T12:57:11.410Z] Accepted request POST /musicland-d33f9/us-central1/music-generateMusic --> us-central1-music-generateMusic +[debug] [2025-09-08T12:57:11.414Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T12:57:11.415Z] [functions] Got req.url=/musicland-d33f9/us-central1/music-generateMusic, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/music-generateMusic, mapping to path=/"}} +[debug] [2025-09-08T12:57:11.415Z] [worker-pool] Cleaned up workers for us-central1-lyrics-analyseLyricsToxicity: 1 --> 0 {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Cleaned up workers for us-central1-lyrics-analyseLyricsToxicity: 1 --> 0"}} +[debug] [2025-09-08T12:57:11.418Z] [worker-pool] addWorker(us-central1-music-generateMusic) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] addWorker(us-central1-music-generateMusic)"}} +[debug] [2025-09-08T12:57:11.419Z] [worker-pool] Adding worker with key us-central1-music-generateMusic, total=1 {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Adding worker with key us-central1-music-generateMusic, total=1"}} +[debug] [2025-09-08T12:57:11.947Z] [runtime-status] [30948] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T12:57:11.948Z] [runtime-status] [30948] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T12:57:11.948Z] [runtime-status] [30948] Outgoing network have been stubbed. [{"name":"http","status":"mocked"},{"name":"http","status":"mocked"},{"name":"https","status":"mocked"},{"name":"https","status":"mocked"},{"name":"net","status":"mocked"}] {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Outgoing network have been stubbed. [{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"net\",\"status\":\"mocked\"}]"}} +[debug] [2025-09-08T12:57:11.948Z] [runtime-status] [30948] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T12:57:12.008Z] [runtime-status] [30948] Checked functions.config() {"config":{}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Checked functions.config() {\"config\":{}}"}} +[debug] [2025-09-08T12:57:12.008Z] [runtime-status] [30948] firebase-functions has been stubbed. {"functionsResolution":{"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] firebase-functions has been stubbed. {\"functionsResolution\":{\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}}"}} +[debug] [2025-09-08T12:57:12.008Z] [runtime-status] [30948] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T12:57:12.010Z] [runtime-status] [30948] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T12:57:12.010Z] [runtime-status] [30948] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T12:57:12.010Z] [runtime-status] [30948] firebase-admin has been stubbed. {"adminResolution":{"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] firebase-admin has been stubbed. {\"adminResolution\":{\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}}"}} +[debug] [2025-09-08T12:57:12.010Z] [runtime-status] [30948] initializeApp(DEFAULT) {"storageBucket":"musicland-d33f9.firebasestorage.app","projectId":"musicland-d33f9"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] initializeApp(DEFAULT) {\"storageBucket\":\"musicland-d33f9.firebasestorage.app\",\"projectId\":\"musicland-d33f9\"}"}} +[debug] [2025-09-08T12:57:12.129Z] [runtime-status] [30948] Functions runtime initialized. {"cwd":"/Users/thomasdemirdjian/Minuit/musicland/functions","node_version":"24.1.0"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Functions runtime initialized. {\"cwd\":\"/Users/thomasdemirdjian/Minuit/musicland/functions\",\"node_version\":\"24.1.0\"}"}} +[debug] [2025-09-08T12:57:12.129Z] [runtime-status] [30948] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_5a1da28295605e2a.sock {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[runtime-status] [30948] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_5a1da28295605e2a.sock"}} +[debug] [2025-09-08T12:57:12.230Z] [worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE"}} +[debug] [2025-09-08T12:57:12.230Z] [worker-pool] submitRequest(triggerId=us-central1-music-generateMusic) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-music-generateMusic)"}} +[info] i functions: Beginning execution of "us-central1-music-generateMusic" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Beginning execution of \"us-central1-music-generateMusic\""}} +[debug] [2025-09-08T12:57:12.231Z] [worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[info] > PAYLOAD { {"user":"PAYLOAD {","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m PAYLOAD {"}} +[info] > customMode: true, {"user":" customMode: true,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m customMode: true,"}} +[info] > instrumental: false, {"user":" instrumental: false,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m instrumental: false,"}} +[info] > model: 'V4_5', {"user":" model: 'V4_5',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m model: 'V4_5',"}} +[info] > prompt: '[couplet]\n' + {"user":" prompt: '[couplet]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m prompt: '[couplet]\\n' +"}} +[info] > 'Viens ce soir dans ma demeure\n' + {"user":" 'Viens ce soir dans ma demeure\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma demeure\\n' +"}} +[info] > 'Tu auras toute ma chaleur\n' + {"user":" 'Tu auras toute ma chaleur\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu auras toute ma chaleur\\n' +"}} +[info] > 'Viens ce soir dans ma cabane\n' + {"user":" 'Viens ce soir dans ma cabane\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma cabane\\n' +"}} +[info] > "Tu n'connaîtras pas la panne\n" + {"user":" \"Tu n'connaîtras pas la panne\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"Tu n'connaîtras pas la panne\\n\" +"}} +[info] > 'Viens ce soir dans ma bicoque\n' + {"user":" 'Viens ce soir dans ma bicoque\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma bicoque\\n' +"}} +[info] > 'Toi la poule et moi le coq\n' + {"user":" 'Toi la poule et moi le coq\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Toi la poule et moi le coq\\n' +"}} +[info] > 'Viens ce soir dans ma villa\n' + {"user":" 'Viens ce soir dans ma villa\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma villa\\n' +"}} +[info] > 'Tu verras tu reviendras\n' + {"user":" 'Tu verras tu reviendras\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu verras tu reviendras\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[refrain]\n' + {"user":" '[refrain]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[refrain]\\n' +"}} +[info] > 'Tu veux mon zizi?\n' + {"user":" 'Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu veux mon zizi?\\n' +"}} +[info] > '(Oui, oui, oui, oui)\n' + {"user":" '(Oui, oui, oui, oui)\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '(Oui, oui, oui, oui)\\n' +"}} +[info] > "J'vais te le donner oui, oui, oui, oui\n" + {"user":" \"J'vais te le donner oui, oui, oui, oui\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"J'vais te le donner oui, oui, oui, oui\\n\" +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[couplet]\n' + {"user":" '[couplet]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[couplet]\\n' +"}} +[info] > 'Viens ce soir dans ma demeure\n' + {"user":" 'Viens ce soir dans ma demeure\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma demeure\\n' +"}} +[info] > 'Tu auras toute ma chaleur\n' + {"user":" 'Tu auras toute ma chaleur\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu auras toute ma chaleur\\n' +"}} +[info] > 'Viens ce soir dans ma cabane\n' + {"user":" 'Viens ce soir dans ma cabane\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma cabane\\n' +"}} +[info] > "Tu n'connaîtras pas la panne\n" + {"user":" \"Tu n'connaîtras pas la panne\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"Tu n'connaîtras pas la panne\\n\" +"}} +[info] > 'Viens ce soir dans ma bicoque\n' + {"user":" 'Viens ce soir dans ma bicoque\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma bicoque\\n' +"}} +[info] > 'Toi la poule et moi le coq\n' + {"user":" 'Toi la poule et moi le coq\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Toi la poule et moi le coq\\n' +"}} +[info] > 'Viens ce soir dans ma villa\n' + {"user":" 'Viens ce soir dans ma villa\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma villa\\n' +"}} +[info] > 'Tu verras tu reviendras\n' + {"user":" 'Tu verras tu reviendras\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu verras tu reviendras\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[refrain]\n' + {"user":" '[refrain]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[refrain]\\n' +"}} +[info] > 'Tu veux mon zizi?\n' + {"user":" 'Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu veux mon zizi?\\n' +"}} +[info] > '(Oui, oui, oui, oui)\n' + {"user":" '(Oui, oui, oui, oui)\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '(Oui, oui, oui, oui)\\n' +"}} +[info] > "J'vais te le donner oui, oui, oui, oui", {"user":" \"J'vais te le donner oui, oui, oui, oui\",","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"J'vais te le donner oui, oui, oui, oui\","}} +[info] > title: 'I’m In It', {"user":" title: 'I’m In It',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m title: 'I’m In It',"}} +[info] > style: 'Genres: Trap, Latino ; Tempo: Normal ; Instruments: Banjo, Guitare acoustique, Synthétiseur, Guitare électrique, Piano éléctrique ; Vocal: Seductive, sensual tone ; Vocal (user): Technique vocale entre parler et chanter, typique de la musique expressionniste. ; Voix séduisante et sensuelle. ; Chant puissant (styles pop et Broadway). ; Mix: propre, punchy, large stéréo, radio-ready. Titre: I’m In It\n' + {"user":" style: 'Genres: Trap, Latino ; Tempo: Normal ; Instruments: Banjo, Guitare acoustique, Synthétiseur, Guitare électrique, Piano éléctrique ; Vocal: Seductive, sensual tone ; Vocal (user): Technique vocale entre parler et chanter, typique de la musique expressionniste. ; Voix séduisante et sensuelle. ; Chant puissant (styles pop et Broadway). ; Mix: propre, punchy, large stéréo, radio-ready. Titre: I’m In It\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m style: 'Genres: Trap, Latino ; Tempo: Normal ; Instruments: Banjo, Guitare acoustique, Synthétiseur, Guitare électrique, Piano éléctrique ; Vocal: Seductive, sensual tone ; Vocal (user): Technique vocale entre parler et chanter, typique de la musique expressionniste. ; Voix séduisante et sensuelle. ; Chant puissant (styles pop et Broadway). ; Mix: propre, punchy, large stéréo, radio-ready. Titre: I’m In It\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > 'Style: Genres: Trap, Latino Tempo normal. Instruments principaux: Banjo, Guitare acoustique, Synthétiseur, Guitare électrique, Piano éléctrique Vocal direction: Seductive, sensual tone User vocal r', {"user":" 'Style: Genres: Trap, Latino Tempo normal. Instruments principaux: Banjo, Guitare acoustique, Synthétiseur, Guitare électrique, Piano éléctrique Vocal direction: Seductive, sensual tone User vocal r',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Style: Genres: Trap, Latino Tempo normal. Instruments principaux: Banjo, Guitare acoustique, Synthétiseur, Guitare électrique, Piano éléctrique Vocal direction: Seductive, sensual tone User vocal r',"}} +[info] > callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback' {"user":" callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback'","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback'"}} +[info] > } {"user":"}","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m }"}} +[debug] [2025-09-08T12:57:12.614Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-music-generateMusic" in 383.260167ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finished \"us-central1-music-generateMusic\" in 383.260167ms"}} +[debug] [2025-09-08T12:57:12.615Z] [worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE"}} +[debug] [2025-09-08T12:57:12.615Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T12:57:12.615Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T12:57:12.615Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:11:33.078Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T13:11:33.078Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:11:33.079Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T13:11:33.078Z"],"workRunningCount":1} +[debug] [2025-09-08T13:11:33.079Z] Accepted request POST /musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity --> us-central1-lyrics-analyseLyricsToxicity +[debug] [2025-09-08T13:11:33.081Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T13:11:33.081Z] [functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/"}} +[debug] [2025-09-08T13:11:33.083Z] [worker-pool] addWorker(us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] addWorker(us-central1-lyrics-analyseLyricsToxicity)"}} +[debug] [2025-09-08T13:11:33.083Z] [worker-pool] Adding worker with key us-central1-lyrics-analyseLyricsToxicity, total=1 {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Adding worker with key us-central1-lyrics-analyseLyricsToxicity, total=1"}} +[debug] [2025-09-08T13:11:33.514Z] [runtime-status] [41753] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T13:11:33.514Z] [runtime-status] [41753] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:11:33.514Z] [runtime-status] [41753] Outgoing network have been stubbed. [{"name":"http","status":"mocked"},{"name":"http","status":"mocked"},{"name":"https","status":"mocked"},{"name":"https","status":"mocked"},{"name":"net","status":"mocked"}] {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Outgoing network have been stubbed. [{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"net\",\"status\":\"mocked\"}]"}} +[debug] [2025-09-08T13:11:33.515Z] [runtime-status] [41753] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:11:33.625Z] [runtime-status] [41753] Checked functions.config() {"config":{}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Checked functions.config() {\"config\":{}}"}} +[debug] [2025-09-08T13:11:33.625Z] [runtime-status] [41753] firebase-functions has been stubbed. {"functionsResolution":{"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] firebase-functions has been stubbed. {\"functionsResolution\":{\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}}"}} +[debug] [2025-09-08T13:11:33.625Z] [runtime-status] [41753] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:11:33.626Z] [runtime-status] [41753] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T13:11:33.627Z] [runtime-status] [41753] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:11:33.627Z] [runtime-status] [41753] firebase-admin has been stubbed. {"adminResolution":{"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] firebase-admin has been stubbed. {\"adminResolution\":{\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}}"}} +[debug] [2025-09-08T13:11:33.627Z] [runtime-status] [41753] initializeApp(DEFAULT) {"storageBucket":"musicland-d33f9.firebasestorage.app","projectId":"musicland-d33f9"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] initializeApp(DEFAULT) {\"storageBucket\":\"musicland-d33f9.firebasestorage.app\",\"projectId\":\"musicland-d33f9\"}"}} +[debug] [2025-09-08T13:11:33.854Z] [runtime-status] [41753] Functions runtime initialized. {"cwd":"/Users/thomasdemirdjian/Minuit/musicland/functions","node_version":"24.1.0"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Functions runtime initialized. {\"cwd\":\"/Users/thomasdemirdjian/Minuit/musicland/functions\",\"node_version\":\"24.1.0\"}"}} +[debug] [2025-09-08T13:11:33.854Z] [runtime-status] [41753] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_00b1638205f54e33.sock {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[runtime-status] [41753] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_00b1638205f54e33.sock"}} +[debug] [2025-09-08T13:11:33.893Z] [worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: IDLE"}} +[debug] [2025-09-08T13:11:33.893Z] [worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity)"}} +[info] i functions: Beginning execution of "us-central1-lyrics-analyseLyricsToxicity" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Beginning execution of \"us-central1-lyrics-analyseLyricsToxicity\""}} +[debug] [2025-09-08T13:11:33.893Z] [worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[debug] [2025-09-08T13:11:41.471Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-lyrics-analyseLyricsToxicity" in 7580.713167ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finished \"us-central1-lyrics-analyseLyricsToxicity\" in 7580.713167ms"}} +[debug] [2025-09-08T13:11:41.471Z] [worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: IDLE"}} +[debug] [2025-09-08T13:11:41.471Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T13:11:41.471Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T13:11:41.471Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:12:46.554Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T13:12:46.554Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:12:46.554Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity-2025-09-08T13:12:46.554Z"],"workRunningCount":1} +[debug] [2025-09-08T13:12:46.554Z] Accepted request POST /musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity --> us-central1-lyrics-analyseLyricsToxicity +[debug] [2025-09-08T13:12:46.556Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T13:12:46.556Z] [functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/lyrics-analyseLyricsToxicity, mapping to path=/"}} +[debug] [2025-09-08T13:12:46.556Z] [worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-lyrics-analyseLyricsToxicity)"}} +[info] i functions: Beginning execution of "us-central1-lyrics-analyseLyricsToxicity" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Beginning execution of \"us-central1-lyrics-analyseLyricsToxicity\""}} +[debug] [2025-09-08T13:12:46.556Z] [worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[debug] [2025-09-08T13:12:55.954Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-lyrics-analyseLyricsToxicity" in 9398.485958ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finished \"us-central1-lyrics-analyseLyricsToxicity\" in 9398.485958ms"}} +[debug] [2025-09-08T13:12:55.956Z] [worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"[worker-us-central1-lyrics-analyseLyricsToxicity-d06c6683-6cd1-4724-b9c2-b0dc100edb16]: IDLE"}} +[debug] [2025-09-08T13:12:55.957Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T13:12:55.957Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-analyseLyricsToxicity"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T13:12:55.958Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:20:51.552Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/music-generateMusic-2025-09-08T13:20:51.552Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:20:51.552Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/music-generateMusic-2025-09-08T13:20:51.552Z"],"workRunningCount":1} +[debug] [2025-09-08T13:20:51.552Z] Accepted request POST /musicland-d33f9/us-central1/music-generateMusic --> us-central1-music-generateMusic +[debug] [2025-09-08T13:20:51.556Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T13:20:51.556Z] [functions] Got req.url=/musicland-d33f9/us-central1/music-generateMusic, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/music-generateMusic, mapping to path=/"}} +[debug] [2025-09-08T13:20:51.556Z] [worker-pool] submitRequest(triggerId=us-central1-music-generateMusic) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-music-generateMusic)"}} +[info] i functions: Beginning execution of "us-central1-music-generateMusic" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Beginning execution of \"us-central1-music-generateMusic\""}} +[debug] [2025-09-08T13:20:51.556Z] [worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[info] > PAYLOAD { {"user":"PAYLOAD {","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m PAYLOAD {"}} +[info] > customMode: true, {"user":" customMode: true,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m customMode: true,"}} +[info] > instrumental: false, {"user":" instrumental: false,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m instrumental: false,"}} +[info] > model: 'V4_5', {"user":" model: 'V4_5',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m model: 'V4_5',"}} +[info] > prompt: '[couplet]\n' + {"user":" prompt: '[couplet]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m prompt: '[couplet]\\n' +"}} +[info] > 'Viens ce soir dans ma demeure\n' + {"user":" 'Viens ce soir dans ma demeure\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma demeure\\n' +"}} +[info] > 'Tu auras toute ma chaleur\n' + {"user":" 'Tu auras toute ma chaleur\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu auras toute ma chaleur\\n' +"}} +[info] > 'Viens ce soir dans ma cabane\n' + {"user":" 'Viens ce soir dans ma cabane\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma cabane\\n' +"}} +[info] > "Tu n'connaîtras pas la panne\n" + {"user":" \"Tu n'connaîtras pas la panne\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"Tu n'connaîtras pas la panne\\n\" +"}} +[info] > 'Viens ce soir dans ma bicoque\n' + {"user":" 'Viens ce soir dans ma bicoque\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma bicoque\\n' +"}} +[info] > 'Toi la poule et moi le coq\n' + {"user":" 'Toi la poule et moi le coq\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Toi la poule et moi le coq\\n' +"}} +[info] > 'Viens ce soir dans ma villa\n' + {"user":" 'Viens ce soir dans ma villa\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma villa\\n' +"}} +[info] > 'Tu verras tu reviendras\n' + {"user":" 'Tu verras tu reviendras\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu verras tu reviendras\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[refrain]\n' + {"user":" '[refrain]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[refrain]\\n' +"}} +[info] > 'Tu veux mon zizi?\n' + {"user":" 'Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu veux mon zizi?\\n' +"}} +[info] > '(Oui, oui, oui, oui)\n' + {"user":" '(Oui, oui, oui, oui)\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '(Oui, oui, oui, oui)\\n' +"}} +[info] > "J'vais te le donner oui, oui, oui, oui\n" + {"user":" \"J'vais te le donner oui, oui, oui, oui\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"J'vais te le donner oui, oui, oui, oui\\n\" +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[couplet]\n' + {"user":" '[couplet]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[couplet]\\n' +"}} +[info] > 'Viens ce soir dans ma demeure\n' + {"user":" 'Viens ce soir dans ma demeure\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma demeure\\n' +"}} +[info] > 'Tu auras toute ma chaleur\n' + {"user":" 'Tu auras toute ma chaleur\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu auras toute ma chaleur\\n' +"}} +[info] > 'Viens ce soir dans ma cabane\n' + {"user":" 'Viens ce soir dans ma cabane\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma cabane\\n' +"}} +[info] > "Tu n'connaîtras pas la panne\n" + {"user":" \"Tu n'connaîtras pas la panne\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"Tu n'connaîtras pas la panne\\n\" +"}} +[info] > 'Viens ce soir dans ma bicoque\n' + {"user":" 'Viens ce soir dans ma bicoque\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma bicoque\\n' +"}} +[info] > 'Toi la poule et moi le coq\n' + {"user":" 'Toi la poule et moi le coq\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Toi la poule et moi le coq\\n' +"}} +[info] > 'Viens ce soir dans ma villa\n' + {"user":" 'Viens ce soir dans ma villa\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma villa\\n' +"}} +[info] > 'Tu verras tu reviendras\n' + {"user":" 'Tu verras tu reviendras\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu verras tu reviendras\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[refrain]\n' + {"user":" '[refrain]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[refrain]\\n' +"}} +[info] > 'Tu veux mon zizi?\n' + {"user":" 'Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu veux mon zizi?\\n' +"}} +[info] > '(Oui, oui, oui, oui)\n' + {"user":" '(Oui, oui, oui, oui)\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '(Oui, oui, oui, oui)\\n' +"}} +[info] > "J'vais te le donner oui, oui, oui, oui", {"user":" \"J'vais te le donner oui, oui, oui, oui\",","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"J'vais te le donner oui, oui, oui, oui\","}} +[info] > title: 'Tu veux mon zizi?', {"user":" title: 'Tu veux mon zizi?',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m title: 'Tu veux mon zizi?',"}} +[info] > style: 'Genres: Rock, Rock progressif ; Tempo: Rapide ; Instruments: Synthétiseur, Guitare acoustique, Guitare électrique ; Vocal: Female lead vocal ; Vocal (user): Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotements et d’harmoniques. ; Mix: propre, punchy, large stéréo, radio-ready. Titre: Tu veux mon zizi?\n' + {"user":" style: 'Genres: Rock, Rock progressif ; Tempo: Rapide ; Instruments: Synthétiseur, Guitare acoustique, Guitare électrique ; Vocal: Female lead vocal ; Vocal (user): Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotements et d’harmoniques. ; Mix: propre, punchy, large stéréo, radio-ready. Titre: Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m style: 'Genres: Rock, Rock progressif ; Tempo: Rapide ; Instruments: Synthétiseur, Guitare acoustique, Guitare électrique ; Vocal: Female lead vocal ; Vocal (user): Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotements et d’harmoniques. ; Mix: propre, punchy, large stéréo, radio-ready. Titre: Tu veux mon zizi?\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > 'Style: Genres: Rock, Rock progressif Rythme énergique et dynamique Instruments principaux: Synthétiseur, Guitare acoustique, Guitare électrique Vocal direction: Female lead vocal User vocal request: Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotement', {"user":" 'Style: Genres: Rock, Rock progressif Rythme énergique et dynamique Instruments principaux: Synthétiseur, Guitare acoustique, Guitare électrique Vocal direction: Female lead vocal User vocal request: Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotement',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Style: Genres: Rock, Rock progressif Rythme énergique et dynamique Instruments principaux: Synthétiseur, Guitare acoustique, Guitare électrique Vocal direction: Female lead vocal User vocal request: Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotement',"}} +[info] > callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback', {"user":" callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback',"}} +[info] > vocalGender: 'f' {"user":" vocalGender: 'f'","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m vocalGender: 'f'"}} +[info] > } {"user":"}","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m }"}} +[debug] [2025-09-08T13:20:52.413Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-music-generateMusic" in 856.882458ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finished \"us-central1-music-generateMusic\" in 856.882458ms"}} +[debug] [2025-09-08T13:20:52.414Z] [worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE"}} +[debug] [2025-09-08T13:20:52.414Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T13:20:52.414Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T13:20:52.414Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:26:46.623Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/music-generateMusic-2025-09-08T13:26:46.623Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:26:46.623Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/music-generateMusic-2025-09-08T13:26:46.623Z"],"workRunningCount":1} +[debug] [2025-09-08T13:26:46.623Z] Accepted request POST /musicland-d33f9/us-central1/music-generateMusic --> us-central1-music-generateMusic +[debug] [2025-09-08T13:26:46.626Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T13:26:46.626Z] [functions] Got req.url=/musicland-d33f9/us-central1/music-generateMusic, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/music-generateMusic, mapping to path=/"}} +[debug] [2025-09-08T13:26:46.626Z] [worker-pool] submitRequest(triggerId=us-central1-music-generateMusic) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-music-generateMusic)"}} +[info] i functions: Beginning execution of "us-central1-music-generateMusic" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Beginning execution of \"us-central1-music-generateMusic\""}} +[debug] [2025-09-08T13:26:46.626Z] [worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[info] > PAYLOAD { {"user":"PAYLOAD {","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m PAYLOAD {"}} +[info] > customMode: true, {"user":" customMode: true,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m customMode: true,"}} +[info] > instrumental: false, {"user":" instrumental: false,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m instrumental: false,"}} +[info] > model: 'V4_5', {"user":" model: 'V4_5',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m model: 'V4_5',"}} +[info] > prompt: '[couplet]\n' + {"user":" prompt: '[couplet]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m prompt: '[couplet]\\n' +"}} +[info] > 'Viens ce soir dans ma demeure\n' + {"user":" 'Viens ce soir dans ma demeure\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma demeure\\n' +"}} +[info] > 'Tu auras toute ma chaleur\n' + {"user":" 'Tu auras toute ma chaleur\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu auras toute ma chaleur\\n' +"}} +[info] > 'Viens ce soir dans ma cabane\n' + {"user":" 'Viens ce soir dans ma cabane\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma cabane\\n' +"}} +[info] > "Tu n'connaîtras pas la panne\n" + {"user":" \"Tu n'connaîtras pas la panne\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"Tu n'connaîtras pas la panne\\n\" +"}} +[info] > 'Viens ce soir dans ma bicoque\n' + {"user":" 'Viens ce soir dans ma bicoque\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma bicoque\\n' +"}} +[info] > 'Toi la poule et moi le coq\n' + {"user":" 'Toi la poule et moi le coq\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Toi la poule et moi le coq\\n' +"}} +[info] > 'Viens ce soir dans ma villa\n' + {"user":" 'Viens ce soir dans ma villa\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma villa\\n' +"}} +[info] > 'Tu verras tu reviendras\n' + {"user":" 'Tu verras tu reviendras\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu verras tu reviendras\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[refrain]\n' + {"user":" '[refrain]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[refrain]\\n' +"}} +[info] > 'Tu veux mon zizi?\n' + {"user":" 'Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu veux mon zizi?\\n' +"}} +[info] > '(Oui, oui, oui, oui)\n' + {"user":" '(Oui, oui, oui, oui)\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '(Oui, oui, oui, oui)\\n' +"}} +[info] > "J'vais te le donner oui, oui, oui, oui\n" + {"user":" \"J'vais te le donner oui, oui, oui, oui\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"J'vais te le donner oui, oui, oui, oui\\n\" +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[couplet]\n' + {"user":" '[couplet]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[couplet]\\n' +"}} +[info] > 'Viens ce soir dans ma demeure\n' + {"user":" 'Viens ce soir dans ma demeure\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma demeure\\n' +"}} +[info] > 'Tu auras toute ma chaleur\n' + {"user":" 'Tu auras toute ma chaleur\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu auras toute ma chaleur\\n' +"}} +[info] > 'Viens ce soir dans ma cabane\n' + {"user":" 'Viens ce soir dans ma cabane\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma cabane\\n' +"}} +[info] > "Tu n'connaîtras pas la panne\n" + {"user":" \"Tu n'connaîtras pas la panne\\n\" +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"Tu n'connaîtras pas la panne\\n\" +"}} +[info] > 'Viens ce soir dans ma bicoque\n' + {"user":" 'Viens ce soir dans ma bicoque\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma bicoque\\n' +"}} +[info] > 'Toi la poule et moi le coq\n' + {"user":" 'Toi la poule et moi le coq\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Toi la poule et moi le coq\\n' +"}} +[info] > 'Viens ce soir dans ma villa\n' + {"user":" 'Viens ce soir dans ma villa\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Viens ce soir dans ma villa\\n' +"}} +[info] > 'Tu verras tu reviendras\n' + {"user":" 'Tu verras tu reviendras\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu verras tu reviendras\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > '[refrain]\n' + {"user":" '[refrain]\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '[refrain]\\n' +"}} +[info] > 'Tu veux mon zizi?\n' + {"user":" 'Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Tu veux mon zizi?\\n' +"}} +[info] > '(Oui, oui, oui, oui)\n' + {"user":" '(Oui, oui, oui, oui)\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '(Oui, oui, oui, oui)\\n' +"}} +[info] > "J'vais te le donner oui, oui, oui, oui", {"user":" \"J'vais te le donner oui, oui, oui, oui\",","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m \"J'vais te le donner oui, oui, oui, oui\","}} +[info] > title: 'Tu veux mon zizi?', {"user":" title: 'Tu veux mon zizi?',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m title: 'Tu veux mon zizi?',"}} +[info] > style: 'Genres: Rock, Rock progressif ; Tempo: Rapide ; Instruments: Synthétiseur, Guitare acoustique, Guitare électrique ; Vocal: Female lead vocal ; Vocal (user): Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotements et d’harmoniques. ; Mix: propre, punchy, large stéréo, radio-ready. Titre: Tu veux mon zizi?\n' + {"user":" style: 'Genres: Rock, Rock progressif ; Tempo: Rapide ; Instruments: Synthétiseur, Guitare acoustique, Guitare électrique ; Vocal: Female lead vocal ; Vocal (user): Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotements et d’harmoniques. ; Mix: propre, punchy, large stéréo, radio-ready. Titre: Tu veux mon zizi?\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m style: 'Genres: Rock, Rock progressif ; Tempo: Rapide ; Instruments: Synthétiseur, Guitare acoustique, Guitare électrique ; Vocal: Female lead vocal ; Vocal (user): Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotements et d’harmoniques. ; Mix: propre, punchy, large stéréo, radio-ready. Titre: Tu veux mon zizi?\\n' +"}} +[info] > '\n' + {"user":" '\\n' +","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m '\\n' +"}} +[info] > 'Style: Genres: Rock, Rock progressif Rythme énergique et dynamique Instruments principaux: Synthétiseur, Guitare acoustique, Guitare électrique Vocal direction: Female lead vocal User vocal request: Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotement', {"user":" 'Style: Genres: Rock, Rock progressif Rythme énergique et dynamique Instruments principaux: Synthétiseur, Guitare acoustique, Guitare électrique Vocal direction: Female lead vocal User vocal request: Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotement',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m 'Style: Genres: Rock, Rock progressif Rythme énergique et dynamique Instruments principaux: Synthétiseur, Guitare acoustique, Guitare électrique Vocal direction: Female lead vocal User vocal request: Une voix féminine interpretra ta chanson. ; Mélange subtil de chuchotement',"}} +[info] > callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback', {"user":" callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m callBackUrl: 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback',"}} +[info] > vocalGender: 'f' {"user":" vocalGender: 'f'","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m vocalGender: 'f'"}} +[info] > } {"user":"}","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m }"}} +[debug] [2025-09-08T13:26:47.442Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-music-generateMusic" in 816.262ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finished \"us-central1-music-generateMusic\" in 816.262ms"}} +[debug] [2025-09-08T13:26:47.443Z] [worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"[worker-us-central1-music-generateMusic-cbb6ce5c-b043-4553-ac98-63150057ee92]: IDLE"}} +[debug] [2025-09-08T13:26:47.443Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T13:26:47.444Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T13:26:47.444Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:29:44.642Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/music-getSunoTimestamps-2025-09-08T13:29:44.642Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:29:44.642Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/music-getSunoTimestamps-2025-09-08T13:29:44.642Z"],"workRunningCount":1} +[debug] [2025-09-08T13:29:44.642Z] Accepted request POST /musicland-d33f9/us-central1/music-getSunoTimestamps --> us-central1-music-getSunoTimestamps +[debug] [2025-09-08T13:29:44.644Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T13:29:44.644Z] [functions] Got req.url=/musicland-d33f9/us-central1/music-getSunoTimestamps, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/music-getSunoTimestamps, mapping to path=/"}} +[debug] [2025-09-08T13:29:44.646Z] [worker-pool] addWorker(us-central1-music-getSunoTimestamps) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] addWorker(us-central1-music-getSunoTimestamps)"}} +[debug] [2025-09-08T13:29:44.646Z] [worker-pool] Adding worker with key us-central1-music-getSunoTimestamps, total=1 {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Adding worker with key us-central1-music-getSunoTimestamps, total=1"}} +[debug] [2025-09-08T13:29:45.114Z] [runtime-status] [55599] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T13:29:45.114Z] [runtime-status] [55599] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:29:45.114Z] [runtime-status] [55599] Outgoing network have been stubbed. [{"name":"http","status":"mocked"},{"name":"http","status":"mocked"},{"name":"https","status":"mocked"},{"name":"https","status":"mocked"},{"name":"net","status":"mocked"}] {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Outgoing network have been stubbed. [{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"net\",\"status\":\"mocked\"}]"}} +[debug] [2025-09-08T13:29:45.115Z] [runtime-status] [55599] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:29:45.256Z] [runtime-status] [55599] Checked functions.config() {"config":{}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Checked functions.config() {\"config\":{}}"}} +[debug] [2025-09-08T13:29:45.256Z] [runtime-status] [55599] firebase-functions has been stubbed. {"functionsResolution":{"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] firebase-functions has been stubbed. {\"functionsResolution\":{\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}}"}} +[debug] [2025-09-08T13:29:45.256Z] [runtime-status] [55599] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:29:45.257Z] [runtime-status] [55599] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T13:29:45.258Z] [runtime-status] [55599] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:29:45.258Z] [runtime-status] [55599] firebase-admin has been stubbed. {"adminResolution":{"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] firebase-admin has been stubbed. {\"adminResolution\":{\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}}"}} +[debug] [2025-09-08T13:29:45.259Z] [runtime-status] [55599] initializeApp(DEFAULT) {"storageBucket":"musicland-d33f9.firebasestorage.app","projectId":"musicland-d33f9"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] initializeApp(DEFAULT) {\"storageBucket\":\"musicland-d33f9.firebasestorage.app\",\"projectId\":\"musicland-d33f9\"}"}} +[debug] [2025-09-08T13:29:45.518Z] [runtime-status] [55599] Functions runtime initialized. {"cwd":"/Users/thomasdemirdjian/Minuit/musicland/functions","node_version":"24.1.0"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Functions runtime initialized. {\"cwd\":\"/Users/thomasdemirdjian/Minuit/musicland/functions\",\"node_version\":\"24.1.0\"}"}} +[debug] [2025-09-08T13:29:45.518Z] [runtime-status] [55599] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_450fe7809337b83d.sock {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[runtime-status] [55599] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_450fe7809337b83d.sock"}} +[debug] [2025-09-08T13:29:45.559Z] [worker-us-central1-music-getSunoTimestamps-ffcfe5f3-2ae1-4cd3-97e2-0ca7637c7abf]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[worker-us-central1-music-getSunoTimestamps-ffcfe5f3-2ae1-4cd3-97e2-0ca7637c7abf]: IDLE"}} +[debug] [2025-09-08T13:29:45.559Z] [worker-pool] submitRequest(triggerId=us-central1-music-getSunoTimestamps) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-music-getSunoTimestamps)"}} +[info] i functions: Beginning execution of "us-central1-music-getSunoTimestamps" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"Beginning execution of \"us-central1-music-getSunoTimestamps\""}} +[debug] [2025-09-08T13:29:45.560Z] [worker-us-central1-music-getSunoTimestamps-ffcfe5f3-2ae1-4cd3-97e2-0ca7637c7abf]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[worker-us-central1-music-getSunoTimestamps-ffcfe5f3-2ae1-4cd3-97e2-0ca7637c7abf]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[info] > 🔎 Récupération des timestamps Suno { taskId: '540fd9b09eb417e98178f718c23c8815', musicIndex: 0 } {"user":"🔎 Récupération des timestamps Suno { taskId: '540fd9b09eb417e98178f718c23c8815', musicIndex: 0 }","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"\u001b[90m> \u001b[39m 🔎 Récupération des timestamps Suno { taskId: '540fd9b09eb417e98178f718c23c8815', musicIndex: 0 }"}} +[info] > 📊 Réponse timestamps Suno API: 200 success {"user":"📊 Réponse timestamps Suno API: 200 success","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"\u001b[90m> \u001b[39m 📊 Réponse timestamps Suno API: 200 success"}} +[info] > ❌ Échec sauvegarde timestamps Firestore: Cannot read properties of undefined (reading 'serverTimestamp') {"user":"❌ Échec sauvegarde timestamps Firestore: Cannot read properties of undefined (reading 'serverTimestamp')","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"\u001b[90m> \u001b[39m ❌ Échec sauvegarde timestamps Firestore: Cannot read properties of undefined (reading 'serverTimestamp')"}} +[debug] [2025-09-08T13:29:47.183Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-music-getSunoTimestamps" in 1623.7001249999998ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"Finished \"us-central1-music-getSunoTimestamps\" in 1623.7001249999998ms"}} +[debug] [2025-09-08T13:29:47.184Z] [worker-us-central1-music-getSunoTimestamps-ffcfe5f3-2ae1-4cd3-97e2-0ca7637c7abf]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"[worker-us-central1-music-getSunoTimestamps-ffcfe5f3-2ae1-4cd3-97e2-0ca7637c7abf]: IDLE"}} +[debug] [2025-09-08T13:29:47.184Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T13:29:47.184Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-getSunoTimestamps"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T13:29:47.184Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:43:44.046Z] [work-queue] {"queuedWork":["/musicland-d33f9/us-central1/lyrics-generateLyrics-2025-09-08T13:43:44.046Z"],"queueLength":1,"runningWork":[],"workRunningCount":0} +[debug] [2025-09-08T13:43:44.046Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":["/musicland-d33f9/us-central1/lyrics-generateLyrics-2025-09-08T13:43:44.046Z"],"workRunningCount":1} +[debug] [2025-09-08T13:43:44.046Z] Accepted request POST /musicland-d33f9/us-central1/lyrics-generateLyrics --> us-central1-lyrics-generateLyrics +[debug] [2025-09-08T13:43:44.049Z] [functions] Runtime ready! Sending request! {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Runtime ready! Sending request!"}} +[debug] [2025-09-08T13:43:44.049Z] [functions] Got req.url=/musicland-d33f9/us-central1/lyrics-generateLyrics, mapping to path=/ {"metadata":{"emulator":{"name":"functions"},"message":"[functions] Got req.url=/musicland-d33f9/us-central1/lyrics-generateLyrics, mapping to path=/"}} +[debug] [2025-09-08T13:43:44.053Z] [worker-pool] addWorker(us-central1-lyrics-generateLyrics) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] addWorker(us-central1-lyrics-generateLyrics)"}} +[debug] [2025-09-08T13:43:44.054Z] [worker-pool] Adding worker with key us-central1-lyrics-generateLyrics, total=1 {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] Adding worker with key us-central1-lyrics-generateLyrics, total=1"}} +[debug] [2025-09-08T13:43:44.529Z] [runtime-status] [66591] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T13:43:44.529Z] [runtime-status] [66591] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:43:44.529Z] [runtime-status] [66591] Outgoing network have been stubbed. [{"name":"http","status":"mocked"},{"name":"http","status":"mocked"},{"name":"https","status":"mocked"},{"name":"https","status":"mocked"},{"name":"net","status":"mocked"}] {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Outgoing network have been stubbed. [{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"http\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"https\",\"status\":\"mocked\"},{\"name\":\"net\",\"status\":\"mocked\"}]"}} +[debug] [2025-09-08T13:43:44.529Z] [runtime-status] [66591] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:43:44.652Z] [runtime-status] [66591] Checked functions.config() {"config":{}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Checked functions.config() {\"config\":{}}"}} +[debug] [2025-09-08T13:43:44.652Z] [runtime-status] [66591] firebase-functions has been stubbed. {"functionsResolution":{"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] firebase-functions has been stubbed. {\"functionsResolution\":{\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}}"}} +[debug] [2025-09-08T13:43:44.653Z] [runtime-status] [66591] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:43:44.654Z] [runtime-status] [66591] Resolved module firebase-admin {"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Resolved module firebase-admin {\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}"}} +[debug] [2025-09-08T13:43:44.655Z] [runtime-status] [66591] Resolved module firebase-functions {"declared":true,"installed":true,"version":"6.4.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Resolved module firebase-functions {\"declared\":true,\"installed\":true,\"version\":\"6.4.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-functions/lib/v2/index.js\"}"}} +[debug] [2025-09-08T13:43:44.655Z] [runtime-status] [66591] firebase-admin has been stubbed. {"adminResolution":{"declared":true,"installed":true,"version":"12.7.0","resolution":"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js"}} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] firebase-admin has been stubbed. {\"adminResolution\":{\"declared\":true,\"installed\":true,\"version\":\"12.7.0\",\"resolution\":\"/Users/thomasdemirdjian/Minuit/musicland/functions/node_modules/firebase-admin/lib/index.js\"}}"}} +[debug] [2025-09-08T13:43:44.655Z] [runtime-status] [66591] initializeApp(DEFAULT) {"storageBucket":"musicland-d33f9.firebasestorage.app","projectId":"musicland-d33f9"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] initializeApp(DEFAULT) {\"storageBucket\":\"musicland-d33f9.firebasestorage.app\",\"projectId\":\"musicland-d33f9\"}"}} +[debug] [2025-09-08T13:43:44.899Z] [runtime-status] [66591] Functions runtime initialized. {"cwd":"/Users/thomasdemirdjian/Minuit/musicland/functions","node_version":"24.1.0"} {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Functions runtime initialized. {\"cwd\":\"/Users/thomasdemirdjian/Minuit/musicland/functions\",\"node_version\":\"24.1.0\"}"}} +[debug] [2025-09-08T13:43:44.899Z] [runtime-status] [66591] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_b4e84136337bd967.sock {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[runtime-status] [66591] Listening to port: /var/folders/4x/n553v4ds6xq73gwblz9jm7t00000gn/T/fire_emu_b4e84136337bd967.sock"}} +[debug] [2025-09-08T13:43:44.972Z] [worker-us-central1-lyrics-generateLyrics-e2c64583-f8d3-44f3-860f-b229af7c62e3]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[worker-us-central1-lyrics-generateLyrics-e2c64583-f8d3-44f3-860f-b229af7c62e3]: IDLE"}} +[debug] [2025-09-08T13:43:44.972Z] [worker-pool] submitRequest(triggerId=us-central1-lyrics-generateLyrics) {"metadata":{"emulator":{"name":"functions"},"message":"[worker-pool] submitRequest(triggerId=us-central1-lyrics-generateLyrics)"}} +[info] i functions: Beginning execution of "us-central1-lyrics-generateLyrics" {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"Beginning execution of \"us-central1-lyrics-generateLyrics\""}} +[debug] [2025-09-08T13:43:44.972Z] [worker-us-central1-lyrics-generateLyrics-e2c64583-f8d3-44f3-860f-b229af7c62e3]: BUSY {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[worker-us-central1-lyrics-generateLyrics-e2c64583-f8d3-44f3-860f-b229af7c62e3]: BUSY"}} +[info] > {"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"} {"user":{"verifications":{"app":"MISSING","auth":"VALID"},"logging.googleapis.com/labels":{"firebase-log-type":"callable-request-verification"},"severity":"DEBUG","message":"Callable request verification passed"},"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m {\"verifications\":{\"app\":\"MISSING\",\"auth\":\"VALID\"},\"logging.googleapis.com/labels\":{\"firebase-log-type\":\"callable-request-verification\"},\"severity\":\"DEBUG\",\"message\":\"Callable request verification passed\"}"}} +[info] > Function generate lyrics start with data { {"user":"Function generate lyrics start with data {","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m Function generate lyrics start with data {"}} +[info] > objective: 'Pour mon club sportif', {"user":" objective: 'Pour mon club sportif',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m objective: 'Pour mon club sportif',"}} +[info] > context: null, {"user":" context: null,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m context: null,"}} +[info] > emotion: "L’Amour : sous entends un sentiment profond d'attachement et d'attraction vers une personne, désir de bien-être et de proximité. Inconditionnel, compassion, ouverture du coeur.", {"user":" emotion: \"L’Amour : sous entends un sentiment profond d'attachement et d'attraction vers une personne, désir de bien-être et de proximité. Inconditionnel, compassion, ouverture du coeur.\",","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m emotion: \"L’Amour : sous entends un sentiment profond d'attachement et d'attraction vers une personne, désir de bien-être et de proximité. Inconditionnel, compassion, ouverture du coeur.\","}} +[info] > style: 'Epic', {"user":" style: 'Epic',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m style: 'Epic',"}} +[info] > audience: null, {"user":" audience: null,","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m audience: null,"}} +[info] > structure: [ 'couplet', 'refrain', 'couplet', 'refrain', 'refrain' ], {"user":" structure: [ 'couplet', 'refrain', 'couplet', 'refrain', 'refrain' ],","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m structure: [ 'couplet', 'refrain', 'couplet', 'refrain', 'refrain' ],"}} +[info] > rhymes: 'Avec rimes' {"user":" rhymes: 'Avec rimes'","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m rhymes: 'Avec rimes'"}} +[info] > } {"user":"}","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"\u001b[90m> \u001b[39m }"}} +[debug] [2025-09-08T13:43:55.318Z] Finishing up request with event=pause {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"Finishing up request with event=pause"}} +[info] i functions: Finished "us-central1-lyrics-generateLyrics" in 10342.935166ms {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"Finished \"us-central1-lyrics-generateLyrics\" in 10342.935166ms"}} +[debug] [2025-09-08T13:43:55.318Z] [worker-us-central1-lyrics-generateLyrics-e2c64583-f8d3-44f3-860f-b229af7c62e3]: IDLE {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"[worker-us-central1-lyrics-generateLyrics-e2c64583-f8d3-44f3-860f-b229af7c62e3]: IDLE"}} +[debug] [2025-09-08T13:43:55.318Z] Finishing up request with event=finish {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"Finishing up request with event=finish"}} +[debug] [2025-09-08T13:43:55.318Z] Finishing up request with event=close {"metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-lyrics-generateLyrics"},"extension":{},"message":"Finishing up request with event=close"}} +[debug] [2025-09-08T13:43:55.318Z] [work-queue] {"queuedWork":[],"queueLength":0,"runningWork":[],"workRunningCount":0} diff --git a/functions/helpers/gemini.js b/functions/helpers/gemini.js index e5e2c44..237900c 100644 --- a/functions/helpers/gemini.js +++ b/functions/helpers/gemini.js @@ -1,5 +1,5 @@ const { googleAI } = require("@genkit-ai/googleai"); -const { genkit } = require("genkit"); +const { genkit, z } = require("genkit"); const { GEMINI_API_KEY } = require("../config/keys"); const admin = require("firebase-admin"); const { Buffer } = require("buffer"); @@ -26,6 +26,144 @@ exports.generateAI = async ({ system = "", prompt = "", schema }) => { return output; }; +// Analyse la toxicité des paroles d'une chanson pour modération. +// Entrée: { title: string, lyrics: string | {couplet?, refrain?} | Array<{type, lyrics}> } +// Sortie (schéma strict): indicateurs de toxicité, raisons, extraits et décision de blocage. +// Cloud Function plus nuancée : bloque le réellement problématique, laisse passer le reste +exports.analyseLyrics = async ({ title = "", lyrics }) => { + // --- Normalisation inchangée (robuste aux différents formats) --- + const normalizeLyrics = (raw) => { + if (!raw) return ""; + if (typeof raw === "string") return raw; + if (Array.isArray(raw)) { + return raw + .map((s) => { + if (!s) return ""; + const label = s.type ? String(s.type).toUpperCase() : "SECTION"; + return `[${label}]\n${s.lyrics || ""}`; + }) + .filter(Boolean) + .join("\n\n"); + } + if (typeof raw === "object") { + const parts = []; + if (raw.couplet) parts.push(`[COUPLET]\n${raw.couplet}`); + if (raw.refrain) parts.push(`[REFRAIN]\n${raw.refrain}`); + return parts.join("\n\n"); + } + return String(raw || ""); + }; + + const lyricsText = normalizeLyrics(lyrics).trim(); + + if (!lyricsText) { + throw new Error( + "analyseLyrics: vous devez fournir des paroles (lyrics) non vides.", + ); + } + + // --- Schéma de sortie (inchangé pour compatibilité) --- + const moderationSchema = z.object({ + title: z.string().describe("Titre analysé (copie du titre fourni)"), + flagged: z + .boolean() + .describe("Vrai si au moins un signalement de toxicité est détecté."), + blocked: z + .boolean() + .describe( + "Vrai si la publication doit être BLOQUÉE (cas graves et non ambigus).", + ), + score: z.number().min(0).max(1).describe("Score global de toxicité (0-1)"), + reasons: z.array(z.string()).describe("Raisons concises de la décision."), + excerpts: z + .array( + z.object({ + quote: z.string().describe("Extrait exact problématique"), + category: z + .string() + .describe( + "Catégorie principale (ex: racism, nazism, sexism, homophobia, harassment, self-harm incitement, terrorism, minors-sexual-content, etc.)", + ), + severity: z + .string() + .describe("none|low|medium|high|critical pour l'extrait"), + }), + ) + .max(10) + .describe("Jusqu'à 10 extraits problématiques"), + success: z.boolean().describe("Toujours true si l'analyse a abouti"), + }); + + // --- Politique : davantage de place à la création tout en restant sûre --- + const system = ` +Tu es un modérateur de contenu spécialisé dans l'analyse de paroles de chanson. +Objectif: protéger les utilisateurs en BLOQUANT uniquement les cas réellement problématiques et non ambigus, tout en LAISSANT PASSER les œuvres qui utilisent la narration, la satire, la critique ou la représentation de personnages. + +Sois STRICT sur les risques graves, mais NE SOIS PAS PUNITIF envers l'expression artistique. +Évalue TOUJOURS: 1) l'intention, 2) le contexte (récit, citation, dénonciation, rôle/persona), 3) la cible, 4) la probabilité de tort réel. + +Retourne UNIQUEMENT un JSON conforme au schéma. Pas de texte hors JSON. +`.trim(); + + // Règles détaillées injectées dans le prompt utilisateur pour guider la décision + const policy = ` +RUBRIQUE DE DÉCISION (résumée): + +A. QUAND BLOQUER (blocked = true) — cas graves et clairs (pas ambigus): + 1) Sexualité impliquant des mineurs (référence explicite, érotisation, incitation). + 2) Apologie explicite et sérieuse de terrorisme/extrémisme réel, ou appel à rejoindre/soutenir. + 3) Appels explicites à la violence ou à un préjudice grave contre une personne/groupe réel. + 4) Déshumanisation évidente et sérieuse de groupes protégés couplée à menace/incitation. + 5) Instruction ou encouragement clair à commettre des crimes violents. + 6) Nazisme/fascisme réel promu (praise/advocacy) ou symboles glorifiés sans critique. + 7) Partage de contenu sexuel non consenti réel (ex: doxxing sexuel, vengeance) ou exploitation. + +B. QUAND NE PAS BLOQUER (blocked = false, mais flagged peut être true): + - Œuvres qui mettent en scène un personnage toxique pour le critiquer, le montrer ou le contextualiser. + - Citations, descriptions historiques, satire, ironie, mises en garde, ou re-appropriation par les communautés visées. + - Métaphores violentes ou langage dur SANS cible réelle ni intention d'incitation. + - Références à des thèmes sombres dans un but narratif/éducatif/critique, sans promotion réelle. + +C. SCORE ET SEVERITY: + - Calibre "score" selon l'impact potentiel et la clarté du tort. + - Indice: low≈0.1–0.3, medium≈0.3–0.6, high≈0.6–0.85, critical>0.85. + - Utilise severity par extrait pour refléter le pire passage. + +D. RELECTURE DE CONTEXTE: + - Demande-toi si le passage est: (i) narration/roleplay/critique —> plutôt allow; (ii) injonction réelle —> plutôt block. + - Si ambigu OU probablement artistique, NE PAS bloquer: flagged=true si nécessaire, blocked=false. +`.trim(); + + const userPrompt = ` +Analyse de paroles de chanson +Titre: ${title || "Sans titre"} + +Paroles: +""" +${lyricsText} +""" + +Consigne: +- Applique la RUBRIQUE DE DÉCISION ci-dessous pour autoriser la création artistique tout en bloquant les cas réellement dangereux. +- "blocked" = true UNIQUEMENT pour les cas A.1 à A.7 (non ambigus). +- Si le contenu semble artistique (récit, personnage, satire, citation, dénonciation) et ne fait pas d'apologie/incitation réelle: "blocked" = false (tu peux mettre "flagged" = true + "score" adapté). +- Donne des "excerpts" courts (citations EXACTES) si possible. + +${policy} +`.trim(); + + const { output } = await genkit({ + plugins: [googleAI({ apiKey: GEMINI_API_KEY })], + model: googleAI.model("gemini-2.5-flash"), + }).generate({ + system, + prompt: userPrompt, + output: { schema: moderationSchema }, + }); + + return output; +}; + exports.generateImageV2 = async (prompt, size = 1024) => { if (typeof prompt !== "string" || prompt.trim().length < 1) { throw new Error("Vous devez spécifier un prompt (string) non vide."); diff --git a/functions/src/lyrics.js b/functions/src/lyrics.js index 1d52d6e..4185335 100644 --- a/functions/src/lyrics.js +++ b/functions/src/lyrics.js @@ -1,6 +1,6 @@ const { onCall } = require("firebase-functions/v2/https"); const { z } = require("genkit"); -const { generateAI } = require("../helpers/gemini"); +const { generateAI, analyseLyrics } = require("../helpers/gemini"); exports.generateLyrics = onCall({}, async ({ auth = {}, data = {} }) => { try { @@ -90,3 +90,58 @@ Pour chaque ` + console.log(e); } }); + +// Vérifie la toxicité des paroles via Gemini et retourne un résultat structuré +// Nom Cloud Function: lyrics-analyseLyricsToxicity +exports.analyseLyricsToxicity = onCall({}, async ({ data = {} }) => { + try { + // Validation d'entrée minimale + const requestSchema = z.object({ + title: z.string().optional(), + lyrics: z + .union([ + z.string(), + z.object({ couplet: z.string().optional(), refrain: z.string().optional() }), + z.array(z.object({ type: z.string().optional(), lyrics: z.string().optional() })), + ]) + .describe("Paroles à analyser (formats supportés)"), + }); + + const parsed = requestSchema.parse(data || {}); + const result = await analyseLyrics({ title: parsed.title || "", lyrics: parsed.lyrics }); + + // Prépare un message lisible pour le front + const highCats = Object.entries(result.categories || {}) + .filter(([, v]) => (typeof v === "number" ? v : 0) >= 0.5) + .map(([k]) => k) + .slice(0, 5); + + let errorCode = "OK"; + let message = "Analyse effectuée: aucun blocage."; + + if (result.blocked) { + errorCode = "TOXIC_CONTENT_BLOCKED"; + const list = highCats.length ? ` (${highCats.join(", ")})` : ""; + message = `Publication bloquée: contenu interdit détecté${list}.`; + } else if (result.flagged) { + errorCode = "TOXIC_CONTENT_FLAGGED"; + const list = highCats.length ? ` (${highCats.join(", ")})` : ""; + message = `Attention: contenu potentiellement sensible détecté${list}.`; + } + + return { + success: !result.blocked, + errorCode, + message, + result, + }; + } catch (err) { + console.error("analyseLyricsToxicity failed", err?.message || err); + return { + success: false, + errorCode: "ANALYSE_FAILED", + message: + "Erreur lors de l'analyse de la toxicité. Réessayez plus tard.", + }; + } +}); diff --git a/functions/src/music.js b/functions/src/music.js index f4e33b1..68af620 100644 --- a/functions/src/music.js +++ b/functions/src/music.js @@ -32,6 +32,97 @@ function clampLen(str = "", max) { return str.length <= max ? str : str.slice(0, max); } +/** + * Déduit des balises vocales explicites reconnues par les modèles (EN) + * à partir de la description utilisateur (FR) + */ +function extractVoiceStrings(voice) { + if (!voice) return []; + if (typeof voice === "string") return [voice]; + if (Array.isArray(voice)) { + return voice + .map((v) => (typeof v === "string" ? v : v?.value || v?.text || "")) + .filter(Boolean); + } + if (typeof voice === "object") { + return Object.values(voice).filter((v) => typeof v === "string" && v.trim()); + } + return []; +} + +function voiceTagsFromUserChoice(voiceInput = "") { + const all = extractVoiceStrings(voiceInput); + const tags = []; + const addFromText = (txt) => { + const v = String(txt || "").toLowerCase(); + + // Gender / ensemble + if (/féminin|feminin|féminine|feminine/.test(v)) tags.push("Female lead vocal"); + if (/masculin|masculine/.test(v)) tags.push("Male lead vocal"); + if (/deux voix|duo|deux chanteurs/.test(v)) tags.push("Duet (male and female voices)"); + if (/choeu?r|gospel/.test(v)) tags.push("Gospel choir vocals"); + + // Delivery/techniques + if (/rap\b/.test(v)) tags.push("Rap vocal"); + if (/slam|parl[ée]e|chant parl[ée]/.test(v)) tags.push("Spoken word / slam"); + if (/raconte|narrat/.test(v)) tags.push("Narration / spoken narrator"); + if (/cri|scream|rugueu|growl/.test(v)) tags.push("Screamed vocals"); + if (/sprech/.test(v)) tags.push("Sprechgesang (sung-spoken) style"); + + // Tone/texture + if (/séduis|sensuel/.test(v)) tags.push("Seductive, sensual tone"); + if (/profonde|r[ée]sonnan/.test(v)) tags.push("Deep, resonant voice"); + if (/l[ée]g[èe]re|a[ée]rienne/.test(v)) tags.push("Light, airy voice"); + if (/relaxante|sophistiqu[ée]/.test(v)) tags.push("Smooth, lounge vocal"); + if (/synth[ée]tique|robot/.test(v)) tags.push("Synthetic/processed vocal"); + if (/d[ée]coup|chopp/.test(v)) tags.push("Chopped vocal samples"); + + // Choir color + if (/c[ée]leste|divin|angel/i.test(v)) tags.push("Ethereal, angelic choir"); + }; + + if (all.length === 0) addFromText(voiceInput); + else all.forEach(addFromText); + + return Array.from(new Set(tags)); +} + +/** + * Détecte un genre vocal simple (m/f) pour Suno à partir du texte utilisateur. + */ +function detectVocalGender(voiceInput = "") { + // If array of objects with category, prefer 'base' + if (Array.isArray(voiceInput)) { + const baseItem = voiceInput.find((v) => v && (v.category === "base" || v?.category?.toLowerCase() === "base")); + const text = baseItem ? baseItem.value || baseItem.text || baseItem : null; + if (text) return detectVocalGender(text); + // Fallback: scan all + for (const it of voiceInput) { + const g = detectVocalGender(it?.value || it?.text || it); + if (g) return g; + } + return undefined; + } + if (typeof voiceInput === "object" && voiceInput) { + // object keyed by category + const base = voiceInput.base || voiceInput["base"]; + if (base) return detectVocalGender(base); + const vals = Object.values(voiceInput).filter(Boolean); + for (const v of vals) { + const g = detectVocalGender(v); + if (g) return g; + } + return undefined; + } + const v = String(voiceInput || "").toLowerCase(); + if (!v) return undefined; + if (/(féminin|feminin|féminine|feminine|voix\s*f[ée]min)/.test(v)) return "f"; + if (/(masculin|masculine|voix\s*mascul)/.test(v)) return "m"; + if (/(femme)/.test(v)) return "f"; + if (/(homme)/.test(v)) return "m"; + return undefined; +} + /** * Construit le style musical à partir des paramètres * @param {Object} params - Les paramètres de style @@ -42,12 +133,17 @@ function buildStyle({ genres = [], voice = "", instruments = [], tempo = "" }) { const flatInstruments = (instruments || []) .map((i) => ("" + i).trim()) .filter(Boolean); + const voiceTags = voiceTagsFromUserChoice(voice); + const voiceStrings = extractVoiceStrings(voice); + const voiceUserText = voiceStrings.join(" ; "); const styleParts = [ flatGenres.length ? `Genres: ${flatGenres.join(", ")}` : "", tempo ? `Tempo: ${tempo}` : "", flatInstruments.length ? `Instruments: ${flatInstruments.join(", ")}` : "", - voice ? `Vocal: ${voice}` : "", + // Inject tags AND the raw user string to fully convey preference + voiceTags.length ? `Vocal: ${voiceTags.join(", ")}` : "", + voiceUserText ? `Vocal (user): ${voiceUserText}` : "", "Mix: propre, punchy, large stéréo, radio-ready", ].filter(Boolean); @@ -132,8 +228,11 @@ function buildGuides({ styleElements.push(`Instruments principaux: ${instruments.join(", ")}`); } - if (voice) { - styleElements.push(`Style vocal: ${voice}`); + const voiceStrings = extractVoiceStrings(voice); + if (voiceStrings.length) { + const tags = voiceTagsFromUserChoice(voice); + if (tags.length) styleElements.push(`Vocal direction: ${tags.join(", ")}`); + styleElements.push(`User vocal request: ${voiceStrings.join(" ; ")}`); } return { @@ -191,6 +290,10 @@ exports.generateMusic = onCall(async ({ data = {} }) => { callBackUrl: SUNO_CALLBACK_URL || "", }; + // Appliquer la préférence de genre vocal si détectée (doc: vocalGender: "m" | "f") + const vGender = detectVocalGender(voice); + if (vGender) payload.vocalGender = vGender; + console.log("PAYLOAD", payload); const response = await axios.post( @@ -201,7 +304,7 @@ exports.generateMusic = onCall(async ({ data = {} }) => { "Content-Type": "application/json", Authorization: `Bearer ${SUNO_API_KEY}`, }, - } + }, ); const parsed = response.data; @@ -214,13 +317,14 @@ exports.generateMusic = onCall(async ({ data = {} }) => { title: safeTitle, style: enhancedStyle, prompt: taggedLyrics, + vocalGender: vGender || null, }, response: parsed || {}, }; } catch (error) { console.error("❌ Erreur lors de la génération de musique:", error); throw new Error( - `Erreur lors de la génération de musique: ${error.message}` + `Erreur lors de la génération de musique: ${error.message}`, ); } }); @@ -249,7 +353,7 @@ exports.getSunoStatus = onCall(async ({ data = {} }) => { Authorization: `Bearer ${SUNO_API_KEY}`, }, timeout: 30000, // 30 secondes de timeout - } + }, ); parsed = response.data; @@ -365,7 +469,7 @@ exports.getSunoTimestamps = onCall(async ({ data = {} }) => { Authorization: `Bearer ${SUNO_API_KEY}`, }, timeout: 30000, - } + }, ); parsed = response.data; console.log("📊 Réponse timestamps Suno API:", parsed?.code, parsed?.msg); @@ -417,7 +521,7 @@ exports.getSunoTimestamps = onCall(async ({ data = {} }) => { }, updatedAt: admin.firestore.FieldValue.serverTimestamp(), }, - { merge: true } + { merge: true }, ); saved = true; console.log("💾 Timestamps sauvegardés dans Firestore", { @@ -427,7 +531,7 @@ exports.getSunoTimestamps = onCall(async ({ data = {} }) => { } catch (e) { console.error( "❌ Échec sauvegarde timestamps Firestore:", - e?.message || e + e?.message || e, ); } @@ -535,7 +639,7 @@ exports.sunoCallback = onRequest({ methods: ["POST"] }, async (req, res) => { const audioUrls = tracks .map( (t) => - t.audio_url || t.audioUrl || t.stream_audio_url || t.streamAudioUrl + t.audio_url || t.audioUrl || t.stream_audio_url || t.streamAudioUrl, ) .filter(Boolean) .slice(0, 2); @@ -550,7 +654,7 @@ exports.sunoCallback = onRequest({ methods: ["POST"] }, async (req, res) => { has_audio_url: !!t.audio_url, has_stream_audio_url: !!t.stream_audio_url, })), - } + }, ); } @@ -575,14 +679,14 @@ exports.sunoCallback = onRequest({ methods: ["POST"] }, async (req, res) => { }, }); const downloadUrl = `https://firebasestorage.googleapis.com/v0/b/${bucket.name}/o/${encodeURIComponent( - path + path, )}?alt=media&token=${token}`; console.log("✅ [SunoCallback] Sauvegardé:", path, "URL:", downloadUrl); return { path, url: downloadUrl }; } catch (e) { console.error( `❌ [SunoCallback] Échec save piste ${index + 1}:`, - e.message + e.message, ); return null; } @@ -602,7 +706,7 @@ exports.sunoCallback = onRequest({ methods: ["POST"] }, async (req, res) => { musicUrls, updatedAt: admin.firestore.FieldValue.serverTimestamp(), }, - { merge: true } + { merge: true }, ); console.log("🏷️ [SunoCallback] Projet marqué GENERATED", { projectId, diff --git a/src/config/firebase.js b/src/config/firebase.js index 0b3ba34..bdab143 100644 --- a/src/config/firebase.js +++ b/src/config/firebase.js @@ -27,9 +27,9 @@ if (!firebase?.apps?.filter(({ name_ }) => name_ === "[DEFAULT]").length) { persistence: getReactNativePersistence(AsyncStorage), }); - // if (__DEV__) { - // firebase.functions().useEmulator("localhost", 5001); - // } + if (__DEV__) { + firebase.functions().useEmulator("localhost", 5001); + } console.log("Firebase init"); } diff --git a/src/screens/Library/AllMyList.js b/src/screens/Library/AllMyList.js index 7b28ddf..839a94e 100644 --- a/src/screens/Library/AllMyList.js +++ b/src/screens/Library/AllMyList.js @@ -1,4 +1,4 @@ -import { useRoute } from "@react-navigation/core"; +import { useRoute } from "@react-navigation/native"; import React, { useState } from "react"; import { View } from "react-native"; import { background } from "../../assets"; diff --git a/src/screens/Production/DownloadPrices.js b/src/screens/Production/DownloadPrices.js index 3b4a259..3a157ce 100644 --- a/src/screens/Production/DownloadPrices.js +++ b/src/screens/Production/DownloadPrices.js @@ -10,7 +10,7 @@ import Style, { size } from "../../styles/Style"; import { Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import { Routes } from "../../navigation"; -import { useRoute } from "@react-navigation/core"; +import { useRoute } from "@react-navigation/native"; const DownloadPrices = () => { const params = useRoute().params; diff --git a/src/screens/Production/SongDownloaded.js b/src/screens/Production/SongDownloaded.js index c8315fb..cabb660 100644 --- a/src/screens/Production/SongDownloaded.js +++ b/src/screens/Production/SongDownloaded.js @@ -12,7 +12,7 @@ import { responsiveHeight } from "react-native-responsive-dimensions"; import { Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import { Routes } from "../../navigation"; -import { useRoute } from "@react-navigation/core"; +import { useRoute } from "@react-navigation/native"; const SongDownloaded = () => { const params = useRoute().params; diff --git a/src/screens/Production/SongRelease.js b/src/screens/Production/SongRelease.js index 58d3bf9..2a23cce 100644 --- a/src/screens/Production/SongRelease.js +++ b/src/screens/Production/SongRelease.js @@ -12,7 +12,7 @@ import { FONT_FAMILY } from "../../styles/Fonts"; import BorderGradientButton from "../../components/BorderGradientButton"; import GradientButton from "../../components/GradientButton"; import { Routes } from "../../navigation"; -import { useRoute } from "@react-navigation/core"; +import { useRoute } from "@react-navigation/native"; const SongRelease = () => { const params = useRoute().params; diff --git a/src/screens/Production/StreamSong.js b/src/screens/Production/StreamSong.js index 6f7a1c0..7cfcb6e 100644 --- a/src/screens/Production/StreamSong.js +++ b/src/screens/Production/StreamSong.js @@ -10,7 +10,7 @@ import Style, { size } from "../../styles/Style"; import { Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import { Routes } from "../../navigation"; -import { useRoute } from "@react-navigation/core"; +import { useRoute } from "@react-navigation/native"; const STREAM_PRICES = [ { diff --git a/src/screens/Studio/ChooseRhythm.js b/src/screens/Studio/ChooseRhythm.js index 2509fd7..df959e8 100644 --- a/src/screens/Studio/ChooseRhythm.js +++ b/src/screens/Studio/ChooseRhythm.js @@ -31,13 +31,12 @@ const ChooseRhythm = ({ selected, setSelected }) => { onPressSelect(item)} tint={selectedItem ? "default" : "dark"} - colors={ - selectedItem - ? ["#FFFFFF00", "#FFFFFF"] - : [Palette.tran, Palette.tran] - } + // Keep transparent colors; highlight selection with border only + colors={[Palette.tran, Palette.tran]} containerStyle={{ ...styles.itemContainer, + borderWidth: selectedItem ? 2 : 0, + borderColor: selectedItem ? "#F94697" : "transparent", }} > { // Selections state const [genres, setGenres] = useState([]); - const [voice, setVoice] = useState(null); + // voice: object keyed by category (e.g., { base: string|null, Sensibilité: string|null, Technique: string|null }) + const [voice, setVoice] = useState({}); const [instruments, setInstruments] = useState([]); const [rhythm, setRhythm] = useState(null); @@ -35,7 +36,8 @@ const ComposeSong = () => { case 0: return Array.isArray(genres) && genres.length > 0; case 1: - return !!voice; + // Must select at least one in base category + return !!(voice && typeof voice === "object" && voice.base); case 2: return Array.isArray(instruments) && instruments.length > 0; case 3: @@ -58,11 +60,15 @@ const ComposeSong = () => { if (c) lyricsArr.push({ type: "couplet", lyrics: c }); if (r) lyricsArr.push({ type: "refrain", lyrics: r }); } + const voiceArray = Object.entries(voice || {}) + .filter(([, v]) => typeof v === "string" && v.trim()) + .map(([category, value]) => ({ category, value })); + return { title: selectedProject?.title || "", lyrics: lyricsArr, genres: Array.isArray(genres) ? genres : [], - voice: voice || undefined, + voice: voiceArray, instruments: Array.isArray(instruments) ? instruments : [], tempo: rhythm || undefined, projectId: selectedProjectId || undefined, @@ -83,13 +89,15 @@ const ComposeSong = () => { genres: Array.isArray(musicConfig?.genres) ? musicConfig.genres : [], - voice: musicConfig?.voice || "", + voice: Array.isArray(musicConfig?.voice) ? musicConfig.voice : [], instruments: Array.isArray(musicConfig?.instruments) ? musicConfig.instruments : [], tempo: musicConfig?.tempo || "", }, musicStatus: null, + sunoTaskId: firebase.firestore.FieldValue.delete(), + musicUrls: firebase.firestore.FieldValue.delete(), }); } } catch (e) {} diff --git a/src/screens/Studio/CustomizeVoice.js b/src/screens/Studio/CustomizeVoice.js index 5706975..1dc6804 100644 --- a/src/screens/Studio/CustomizeVoice.js +++ b/src/screens/Studio/CustomizeVoice.js @@ -7,13 +7,18 @@ import { FONT_FAMILY } from "../../styles/Fonts"; import { BlurView } from "expo-blur"; import { VOICE } from "../../data/data"; -const CustomizeVoice = ({ selected, setSelected }) => { +const CustomizeVoice = ({ selected = {}, setSelected }) => { const [containerLayout, setContainerLayout] = useState(null); - const onPressSelect = (item) => { + // Toggle select: only 1 per category (section.title) + const onPressSelect = (category, item) => { if (!setSelected) return; - if (selected === item) setSelected(null); - else setSelected(item); + const current = selected && typeof selected === "object" ? selected : {}; + // If tapping the same item, deselect; otherwise, set new one for the category + const next = { ...current }; + if (current[category] === item) next[category] = null; + else next[category] = item; + setSelected(next); }; return ( @@ -32,25 +37,26 @@ const CustomizeVoice = ({ selected, setSelected }) => { sections={VOICE} showsVerticalScrollIndicator={false} contentContainerStyle={styles.contentContainer} - renderItem={({ item }) => { - const selectedItem = selected === item; + renderItem={({ item, section }) => { + const cat = section?.title; + const selectedItem = selected?.[cat] === item; return ( onPressSelect(item)} + onPress={() => onPressSelect(cat, item)} tint={selectedItem ? "default" : "dark"} - colors={ - selectedItem - ? ["#FFFFFF00", "#FFFFFF"] - : [Palette.tran, Palette.tran] - } + // Ne pas changer le blur; garder fond transparent comme ChooseInstruments + colors={[Palette.tran, Palette.tran]} containerStyle={{ ...styles.itemContainer, + borderWidth: selectedItem ? 2 : 0, + borderColor: selectedItem ? "#F94697" : "transparent", }} > {item} @@ -89,6 +95,7 @@ const styles = StyleSheet.create({ paddingBottom: 50, }, itemContainer: { + height: 54, backgroundColor: Palette.glass, borderRadius: 14, overflow: "hidden", diff --git a/src/screens/Studio/GeneratingSong.js b/src/screens/Studio/GeneratingSong.js index ab7140a..6974421 100644 --- a/src/screens/Studio/GeneratingSong.js +++ b/src/screens/Studio/GeneratingSong.js @@ -25,8 +25,9 @@ const GeneratingSong = () => { const progressTimerRef = useRef(null); const navigatedRef = useRef(false); const isFocused = useIsFocused(); - const lastConfigKeyRef = useRef(null); const askedRef = useRef(false); + const callingRef = useRef(false); + const localStartRef = useRef(null); // project loaded from provider @@ -39,26 +40,49 @@ const GeneratingSong = () => { progressTimerRef.current = null; } }; - if (selectedProject?.musicStatus === "GENERATED") { + + const status = selectedProject?.musicStatus; + + if (status !== "GENERATING") { + // Reset local start when leaving generating state + localStartRef.current = null; + } + + if (status === "GENERATED") { setProgress(100); clearTimer(); return () => clearTimer(); } + + const resolveStartDate = () => { + const gs = selectedProject?.generationStartAt; + if (gs?.toDate) return gs.toDate(); + if (gs) return new Date(gs); + if (status === "GENERATING") { + if (!localStartRef.current) localStartRef.current = new Date(); + return localStartRef.current; + } + return null; + }; + const update = () => { - const startDate = selectedProject?.generationStartAt?.toDate - ? selectedProject.generationStartAt.toDate() - : new Date(selectedProject?.generationStartAt || Date.now()); + const startDate = resolveStartDate(); + if (!startDate) { + setProgress(0); + return; + } const elapsed = moment().diff(moment(startDate)); const raw = Math.floor((elapsed / totalMs) * 100); // While status is GENERATING, block visual progress at 99% const pct = Math.max(0, Math.min(99, raw)); setProgress(pct); }; + update(); clearTimer(); progressTimerRef.current = setInterval(update, 1000); return () => clearTimer(); - }, [selectedProject?.musicStatus]); + }, [selectedProject?.musicStatus, selectedProject?.generationStartAt]); // Auto navigate to SongReady when generation completed useEffect(() => { @@ -76,7 +100,7 @@ const GeneratingSong = () => { title: cfg?.title || "", lyrics: Array.isArray(cfg?.lyrics) ? cfg.lyrics : [], genres: Array.isArray(cfg?.genres) ? cfg.genres : [], - voice: cfg?.voice || "", + voice: Array.isArray(cfg?.voice) ? cfg.voice : [], instruments: Array.isArray(cfg?.instruments) ? cfg.instruments : [], tempo: cfg?.tempo || "", }; @@ -131,37 +155,49 @@ const GeneratingSong = () => { } } - // Trigger generation only when focused; ask once per config + // Ensure we never call generation more than once concurrently + const startMusicGenerationOnce = React.useCallback(() => { + if (callingRef.current) return; + callingRef.current = true; + startMusicGeneration() + .catch(() => {}) + .finally(() => { + // Keep locked while status transitions to GENERATING; will be prevented by guards + setTimeout(() => { + callingRef.current = false; + }, 500); + }); + }, []); + + // Trigger generation only when focused; ask once while idle useEffect(() => { if (!isFocused) return; + const status = selectedProject?.musicStatus; + const titleOk = !!selectedProject?.title; + // Idle if not actively generating or generated (ignore stale taskId) + const isIdle = + status == null || + status === "" || + status === "PENDING" || + status === "READY"; - const key = JSON.stringify(effectiveConfig || {}); - if (lastConfigKeyRef.current !== key) { - lastConfigKeyRef.current = key; - askedRef.current = false; - } - - const canAsk = - !!selectedProject?.title && selectedProject?.musicStatus !== "GENERATING"; - - if (canAsk && !askedRef.current) { + if (titleOk && isIdle && !askedRef.current) { askedRef.current = true; Alert.alert("Attention", "Une génération va être lancée. Continuer ?", [ { text: "Non", style: "cancel", + onPress: () => { + askedRef.current = false; + }, }, - { - text: "Oui", - onPress: () => startMusicGeneration(), - }, + { text: "Oui", onPress: () => startMusicGenerationOnce() }, ]); } }, [ isFocused, selectedProject?.title, selectedProject?.musicStatus, - effectiveConfig, ]); return ( diff --git a/src/screens/Studio/Regenerate.js b/src/screens/Studio/Regenerate.js index 9446a4c..7e4e51f 100644 --- a/src/screens/Studio/Regenerate.js +++ b/src/screens/Studio/Regenerate.js @@ -8,7 +8,7 @@ import { goBack } from "../../navigation/NavigationService"; import { gutters, Palette } from "../../styles"; import { FONT_FAMILY } from "../../styles/Fonts"; import GradientButton from "../../components/GradientButton"; -import { useRoute } from "@react-navigation/core"; +import { useRoute } from "@react-navigation/native"; const Regenerate = () => { const params = useRoute().params; diff --git a/src/screens/Writing/EmotionConvey.js b/src/screens/Writing/EmotionConvey.js index 444c61f..3350ae5 100644 --- a/src/screens/Writing/EmotionConvey.js +++ b/src/screens/Writing/EmotionConvey.js @@ -51,8 +51,13 @@ const EmotionConvey = ({ onPressSelect(item)} + containerStyle={{ + borderWidth: selectedItem ? 2 : 0, + borderColor: selectedItem ? "#F94697" : "transparent", + borderRadius: 14, + }} > onPressSelect(item)} tint={selectedItem ? "default" : "dark"} - colors={ - selectedItem - ? ["#FFFFFF00", "#FFFFFF"] - : [Palette.tran, Palette.tran] - } + colors={[Palette.tran, Palette.tran]} containerStyle={{ ...styles.itemContainer, + borderWidth: selectedItem ? 2 : 0, + borderColor: selectedItem ? "#F94697" : "transparent", }} > @@ -81,6 +79,7 @@ const styles = StyleSheet.create({ paddingBottom: 50, }, itemContainer: { + height: 54, borderRadius: 14, shadowColor: "#00000040", shadowOffset: { diff --git a/src/screens/Writing/Lyrics.js b/src/screens/Writing/Lyrics.js index bfd97e6..dd218c3 100644 --- a/src/screens/Writing/Lyrics.js +++ b/src/screens/Writing/Lyrics.js @@ -1,5 +1,5 @@ import { View, ScrollView, Alert } from "react-native"; -import React, { useMemo, useState, useCallback, useEffect, useRef } from "react"; +import React, { useMemo, useState, useCallback, useEffect } from "react"; import Page from "../../layouts/Page"; import MusicLandHeader from "../../components/MusicLandHeader"; import { navigate } from "../../navigation/NavigationService"; @@ -61,37 +61,6 @@ const Lyrics = ({ navigation }) => { }, [projectTitle, projectLyrics, projectConfig]); const [titleValue, setTitleValue] = useState(initial.title || ""); - const titleSaveTimer = useRef(null); - - // Auto-save du titre lorsqu'il est modifié (si non vide) - useEffect(() => { - const newTitle = (titleValue || "").trim(); - // Annuler tout timer précédent - if (titleSaveTimer.current) clearTimeout(titleSaveTimer.current); - // Ne rien faire si inchangé vs projet courant - const currentTitle = (selectedProject?.title || "").trim(); - if (!newTitle || newTitle === currentTitle) return; - - titleSaveTimer.current = setTimeout(async () => { - try { - await projectsRef.doc(selectedProjectId).set( - { - title: newTitle, - titleLower: newTitle.toLowerCase(), - updatedAt: firebase.firestore.FieldValue.serverTimestamp(), - }, - { merge: true }, - ); - } catch (e) { - // silencieux: l'utilisateur pourra tjs valider plus tard - console.log("Auto-save titre échoué", e?.message); - } - }, 500); - - return () => { - if (titleSaveTimer.current) clearTimeout(titleSaveTimer.current); - }; - }, [titleValue, selectedProjectId, selectedProject]); const [sections, setSections] = useState(initial.sections || []); const setSectionAt = (index, value) => { setSections((prev) => { @@ -158,6 +127,79 @@ const Lyrics = ({ navigation }) => { s.lyrics === normalizedNewLyrics[i]?.lyrics, ); + // 1) Appel de la Cloud Function de modération avant tout enregistrement + try { + const callable = firebase + .functions() + .httpsCallable("lyrics-analyseLyricsToxicity"); + const { data } = await callable({ + title: titleTrimmed, + lyrics: normalizedNewLyrics, + }); + + if (!data?.success) { + // Blocage dur: afficher le message et ne pas sauvegarder + if (data?.errorCode === "TOXIC_CONTENT_BLOCKED") { + const quotes = Array.isArray(data?.result?.excerpts) + ? data.result.excerpts + .slice(0, 3) + .map((e) => `• ${e.quote}`) + .join("\n") + : null; + Alert.alert( + "Contenu interdit", + [data?.message, quotes].filter(Boolean).join("\n\n"), + ); + return; // stop here + } + // Erreur d'analyse: informer et arrêter + if (data?.errorCode === "ANALYSE_FAILED") { + Alert.alert( + "Analyse indisponible", + "Impossible de vérifier la toxicité pour le moment. Réessayez plus tard.", + ); + return; + } + } + + // Cas signalé mais non bloquant: demander confirmation + if (data?.errorCode === "TOXIC_CONTENT_FLAGGED") { + const quotes = Array.isArray(data?.result?.excerpts) + ? data.result.excerpts + .slice(0, 3) + .map((e) => `• ${e.quote}`) + .join("\n") + : null; + const msg = [data?.message, quotes].filter(Boolean).join("\n\n"); + + const proceed = await new Promise((resolve) => { + Alert.alert("Contenu potentiellement sensible", msg, [ + { + text: "Annuler", + style: "cancel", + onPress: () => resolve(false), + }, + { + text: "Continuer", + style: "destructive", + onPress: () => resolve(true), + }, + ]); + }); + if (!proceed) return; + } + } catch (moderationError) { + console.log( + "Moderation call failed", + moderationError?.message || moderationError, + ); + Alert.alert( + "Analyse indisponible", + "Impossible de vérifier la toxicité pour le moment. Réessayez plus tard.", + ); + return; + } + const baseData = { title: titleTrimmed, titleLower: titleTrimmed.toLowerCase(), diff --git a/src/screens/Writing/Rhymes.js b/src/screens/Writing/Rhymes.js index 76be441..e1f2287 100644 --- a/src/screens/Writing/Rhymes.js +++ b/src/screens/Writing/Rhymes.js @@ -33,18 +33,16 @@ const Rhymes = ({ selected: selectedProp, setSelected: setSelectedProp }) => { key={index} onPress={() => onPressSelect(item)} tint={selectedItem ? "default" : "dark"} - colors={ - selectedItem - ? ["#FFFFFF00", "#FFFFFF"] - : [Palette.tran, Palette.tran] - } + colors={[Palette.tran, Palette.tran]} containerStyle={{ ...styles.itemContainer, + borderWidth: selectedItem ? 2 : 0, + borderColor: selectedItem ? "#F94697" : "transparent", }} > onPressSelect(item)} tint={selectedItem ? "default" : "dark"} - colors={ - selectedItem - ? ["#FFFFFF00", "#FFFFFF"] - : [Palette.tran, Palette.tran] - } + colors={[Palette.tran, Palette.tran]} containerStyle={{ ...styles.itemContainer, + borderWidth: selectedItem ? 2 : 0, + borderColor: selectedItem ? "#F94697" : "transparent", }} > onPressSelect(item.title)} containerStyle={{ ...styles.itemContainer, + borderWidth: selectedItem ? 2 : 0, + borderColor: selectedItem ? "#F94697" : "transparent", }} >