filter on lyrics for bloking unwanted content, tickets fix

This commit is contained in:
Thomas Demirdjian
2025-09-08 15:48:29 +02:00
parent 987388c501
commit a3dc4f89b7
22 changed files with 1386 additions and 126 deletions
+42
View File
@@ -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.
+831
View File
@@ -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: 'Im In It', {"user":" title: 'Im In It',","metadata":{"emulator":{"name":"functions"},"function":{"name":"us-central1-music-generateMusic"},"extension":{},"message":"\u001b[90m> \u001b[39m title: 'Im 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: Im 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: Im 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: Im 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 dharmoniques. ; 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 dharmoniques. ; 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 dharmoniques. ; 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 dharmoniques. ; 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 dharmoniques. ; 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 dharmoniques. ; 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: "LAmour : 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: \"LAmour : 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: \"LAmour : 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}
+139 -1
View File
@@ -1,5 +1,5 @@
const { googleAI } = require("@genkit-ai/googleai"); const { googleAI } = require("@genkit-ai/googleai");
const { genkit } = require("genkit"); const { genkit, z } = require("genkit");
const { GEMINI_API_KEY } = require("../config/keys"); const { GEMINI_API_KEY } = require("../config/keys");
const admin = require("firebase-admin"); const admin = require("firebase-admin");
const { Buffer } = require("buffer"); const { Buffer } = require("buffer");
@@ -26,6 +26,144 @@ exports.generateAI = async ({ system = "", prompt = "", schema }) => {
return output; 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.10.3, medium≈0.30.6, high≈0.60.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) => { exports.generateImageV2 = async (prompt, size = 1024) => {
if (typeof prompt !== "string" || prompt.trim().length < 1) { if (typeof prompt !== "string" || prompt.trim().length < 1) {
throw new Error("Vous devez spécifier un prompt (string) non vide."); throw new Error("Vous devez spécifier un prompt (string) non vide.");
+56 -1
View File
@@ -1,6 +1,6 @@
const { onCall } = require("firebase-functions/v2/https"); const { onCall } = require("firebase-functions/v2/https");
const { z } = require("genkit"); const { z } = require("genkit");
const { generateAI } = require("../helpers/gemini"); const { generateAI, analyseLyrics } = require("../helpers/gemini");
exports.generateLyrics = onCall({}, async ({ auth = {}, data = {} }) => { exports.generateLyrics = onCall({}, async ({ auth = {}, data = {} }) => {
try { try {
@@ -90,3 +90,58 @@ Pour chaque ` +
console.log(e); 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.",
};
}
});
+118 -14
View File
@@ -32,6 +32,97 @@ function clampLen(str = "", max) {
return str.length <= max ? str : str.slice(0, 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 * Construit le style musical à partir des paramètres
* @param {Object} params - Les paramètres de style * @param {Object} params - Les paramètres de style
@@ -42,12 +133,17 @@ function buildStyle({ genres = [], voice = "", instruments = [], tempo = "" }) {
const flatInstruments = (instruments || []) const flatInstruments = (instruments || [])
.map((i) => ("" + i).trim()) .map((i) => ("" + i).trim())
.filter(Boolean); .filter(Boolean);
const voiceTags = voiceTagsFromUserChoice(voice);
const voiceStrings = extractVoiceStrings(voice);
const voiceUserText = voiceStrings.join(" ; ");
const styleParts = [ const styleParts = [
flatGenres.length ? `Genres: ${flatGenres.join(", ")}` : "", flatGenres.length ? `Genres: ${flatGenres.join(", ")}` : "",
tempo ? `Tempo: ${tempo}` : "", tempo ? `Tempo: ${tempo}` : "",
flatInstruments.length ? `Instruments: ${flatInstruments.join(", ")}` : "", 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", "Mix: propre, punchy, large stéréo, radio-ready",
].filter(Boolean); ].filter(Boolean);
@@ -132,8 +228,11 @@ function buildGuides({
styleElements.push(`Instruments principaux: ${instruments.join(", ")}`); styleElements.push(`Instruments principaux: ${instruments.join(", ")}`);
} }
if (voice) { const voiceStrings = extractVoiceStrings(voice);
styleElements.push(`Style vocal: ${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 { return {
@@ -191,6 +290,10 @@ exports.generateMusic = onCall(async ({ data = {} }) => {
callBackUrl: SUNO_CALLBACK_URL || "", 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); console.log("PAYLOAD", payload);
const response = await axios.post( const response = await axios.post(
@@ -201,7 +304,7 @@ exports.generateMusic = onCall(async ({ data = {} }) => {
"Content-Type": "application/json", "Content-Type": "application/json",
Authorization: `Bearer ${SUNO_API_KEY}`, Authorization: `Bearer ${SUNO_API_KEY}`,
}, },
} },
); );
const parsed = response.data; const parsed = response.data;
@@ -214,13 +317,14 @@ exports.generateMusic = onCall(async ({ data = {} }) => {
title: safeTitle, title: safeTitle,
style: enhancedStyle, style: enhancedStyle,
prompt: taggedLyrics, prompt: taggedLyrics,
vocalGender: vGender || null,
}, },
response: parsed || {}, response: parsed || {},
}; };
} catch (error) { } catch (error) {
console.error("❌ Erreur lors de la génération de musique:", error); console.error("❌ Erreur lors de la génération de musique:", error);
throw new 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}`, Authorization: `Bearer ${SUNO_API_KEY}`,
}, },
timeout: 30000, // 30 secondes de timeout timeout: 30000, // 30 secondes de timeout
} },
); );
parsed = response.data; parsed = response.data;
@@ -365,7 +469,7 @@ exports.getSunoTimestamps = onCall(async ({ data = {} }) => {
Authorization: `Bearer ${SUNO_API_KEY}`, Authorization: `Bearer ${SUNO_API_KEY}`,
}, },
timeout: 30000, timeout: 30000,
} },
); );
parsed = response.data; parsed = response.data;
console.log("📊 Réponse timestamps Suno API:", parsed?.code, parsed?.msg); 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(), updatedAt: admin.firestore.FieldValue.serverTimestamp(),
}, },
{ merge: true } { merge: true },
); );
saved = true; saved = true;
console.log("💾 Timestamps sauvegardés dans Firestore", { console.log("💾 Timestamps sauvegardés dans Firestore", {
@@ -427,7 +531,7 @@ exports.getSunoTimestamps = onCall(async ({ data = {} }) => {
} catch (e) { } catch (e) {
console.error( console.error(
"❌ Échec sauvegarde timestamps Firestore:", "❌ É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 const audioUrls = tracks
.map( .map(
(t) => (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) .filter(Boolean)
.slice(0, 2); .slice(0, 2);
@@ -550,7 +654,7 @@ exports.sunoCallback = onRequest({ methods: ["POST"] }, async (req, res) => {
has_audio_url: !!t.audio_url, has_audio_url: !!t.audio_url,
has_stream_audio_url: !!t.stream_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( const downloadUrl = `https://firebasestorage.googleapis.com/v0/b/${bucket.name}/o/${encodeURIComponent(
path path,
)}?alt=media&token=${token}`; )}?alt=media&token=${token}`;
console.log("✅ [SunoCallback] Sauvegardé:", path, "URL:", downloadUrl); console.log("✅ [SunoCallback] Sauvegardé:", path, "URL:", downloadUrl);
return { path, url: downloadUrl }; return { path, url: downloadUrl };
} catch (e) { } catch (e) {
console.error( console.error(
`❌ [SunoCallback] Échec save piste ${index + 1}:`, `❌ [SunoCallback] Échec save piste ${index + 1}:`,
e.message e.message,
); );
return null; return null;
} }
@@ -602,7 +706,7 @@ exports.sunoCallback = onRequest({ methods: ["POST"] }, async (req, res) => {
musicUrls, musicUrls,
updatedAt: admin.firestore.FieldValue.serverTimestamp(), updatedAt: admin.firestore.FieldValue.serverTimestamp(),
}, },
{ merge: true } { merge: true },
); );
console.log("🏷️ [SunoCallback] Projet marqué GENERATED", { console.log("🏷️ [SunoCallback] Projet marqué GENERATED", {
projectId, projectId,
+3 -3
View File
@@ -27,9 +27,9 @@ if (!firebase?.apps?.filter(({ name_ }) => name_ === "[DEFAULT]").length) {
persistence: getReactNativePersistence(AsyncStorage), persistence: getReactNativePersistence(AsyncStorage),
}); });
// if (__DEV__) { if (__DEV__) {
// firebase.functions().useEmulator("localhost", 5001); firebase.functions().useEmulator("localhost", 5001);
// } }
console.log("Firebase init"); console.log("Firebase init");
} }
+1 -1
View File
@@ -1,4 +1,4 @@
import { useRoute } from "@react-navigation/core"; import { useRoute } from "@react-navigation/native";
import React, { useState } from "react"; import React, { useState } from "react";
import { View } from "react-native"; import { View } from "react-native";
import { background } from "../../assets"; import { background } from "../../assets";
+1 -1
View File
@@ -10,7 +10,7 @@ import Style, { size } from "../../styles/Style";
import { Palette } from "../../styles"; import { Palette } from "../../styles";
import { FONT_FAMILY } from "../../styles/Fonts"; import { FONT_FAMILY } from "../../styles/Fonts";
import { Routes } from "../../navigation"; import { Routes } from "../../navigation";
import { useRoute } from "@react-navigation/core"; import { useRoute } from "@react-navigation/native";
const DownloadPrices = () => { const DownloadPrices = () => {
const params = useRoute().params; const params = useRoute().params;
+1 -1
View File
@@ -12,7 +12,7 @@ import { responsiveHeight } from "react-native-responsive-dimensions";
import { Palette } from "../../styles"; import { Palette } from "../../styles";
import { FONT_FAMILY } from "../../styles/Fonts"; import { FONT_FAMILY } from "../../styles/Fonts";
import { Routes } from "../../navigation"; import { Routes } from "../../navigation";
import { useRoute } from "@react-navigation/core"; import { useRoute } from "@react-navigation/native";
const SongDownloaded = () => { const SongDownloaded = () => {
const params = useRoute().params; const params = useRoute().params;
+1 -1
View File
@@ -12,7 +12,7 @@ import { FONT_FAMILY } from "../../styles/Fonts";
import BorderGradientButton from "../../components/BorderGradientButton"; import BorderGradientButton from "../../components/BorderGradientButton";
import GradientButton from "../../components/GradientButton"; import GradientButton from "../../components/GradientButton";
import { Routes } from "../../navigation"; import { Routes } from "../../navigation";
import { useRoute } from "@react-navigation/core"; import { useRoute } from "@react-navigation/native";
const SongRelease = () => { const SongRelease = () => {
const params = useRoute().params; const params = useRoute().params;
+1 -1
View File
@@ -10,7 +10,7 @@ import Style, { size } from "../../styles/Style";
import { Palette } from "../../styles"; import { Palette } from "../../styles";
import { FONT_FAMILY } from "../../styles/Fonts"; import { FONT_FAMILY } from "../../styles/Fonts";
import { Routes } from "../../navigation"; import { Routes } from "../../navigation";
import { useRoute } from "@react-navigation/core"; import { useRoute } from "@react-navigation/native";
const STREAM_PRICES = [ const STREAM_PRICES = [
{ {
+4 -5
View File
@@ -31,13 +31,12 @@ const ChooseRhythm = ({ selected, setSelected }) => {
<CreateLyricsHeader <CreateLyricsHeader
onPress={() => onPressSelect(item)} onPress={() => onPressSelect(item)}
tint={selectedItem ? "default" : "dark"} tint={selectedItem ? "default" : "dark"}
colors={ // Keep transparent colors; highlight selection with border only
selectedItem colors={[Palette.tran, Palette.tran]}
? ["#FFFFFF00", "#FFFFFF"]
: [Palette.tran, Palette.tran]
}
containerStyle={{ containerStyle={{
...styles.itemContainer, ...styles.itemContainer,
borderWidth: selectedItem ? 2 : 0,
borderColor: selectedItem ? "#F94697" : "transparent",
}} }}
> >
<View <View
+13 -5
View File
@@ -11,8 +11,8 @@ import ChooseGenre from "./ChooseGenre";
import CustomizeVoice from "./CustomizeVoice"; import CustomizeVoice from "./CustomizeVoice";
import ChooseInstruments from "./ChooseInstruments"; import ChooseInstruments from "./ChooseInstruments";
import ChooseRhythm from "./ChooseRhythm"; import ChooseRhythm from "./ChooseRhythm";
import { projectsRef } from "../../config/firebase";
import { useUser } from "../../providers/UserDataProvider"; import { useUser } from "../../providers/UserDataProvider";
import firebase from "../../config/firebase";
import { Routes } from "../../navigation"; import { Routes } from "../../navigation";
const { width } = Dimensions.get("window"); const { width } = Dimensions.get("window");
@@ -26,7 +26,8 @@ const ComposeSong = () => {
// Selections state // Selections state
const [genres, setGenres] = useState([]); 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 [instruments, setInstruments] = useState([]);
const [rhythm, setRhythm] = useState(null); const [rhythm, setRhythm] = useState(null);
@@ -35,7 +36,8 @@ const ComposeSong = () => {
case 0: case 0:
return Array.isArray(genres) && genres.length > 0; return Array.isArray(genres) && genres.length > 0;
case 1: case 1:
return !!voice; // Must select at least one in base category
return !!(voice && typeof voice === "object" && voice.base);
case 2: case 2:
return Array.isArray(instruments) && instruments.length > 0; return Array.isArray(instruments) && instruments.length > 0;
case 3: case 3:
@@ -58,11 +60,15 @@ const ComposeSong = () => {
if (c) lyricsArr.push({ type: "couplet", lyrics: c }); if (c) lyricsArr.push({ type: "couplet", lyrics: c });
if (r) lyricsArr.push({ type: "refrain", lyrics: r }); 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 { return {
title: selectedProject?.title || "", title: selectedProject?.title || "",
lyrics: lyricsArr, lyrics: lyricsArr,
genres: Array.isArray(genres) ? genres : [], genres: Array.isArray(genres) ? genres : [],
voice: voice || undefined, voice: voiceArray,
instruments: Array.isArray(instruments) ? instruments : [], instruments: Array.isArray(instruments) ? instruments : [],
tempo: rhythm || undefined, tempo: rhythm || undefined,
projectId: selectedProjectId || undefined, projectId: selectedProjectId || undefined,
@@ -83,13 +89,15 @@ const ComposeSong = () => {
genres: Array.isArray(musicConfig?.genres) genres: Array.isArray(musicConfig?.genres)
? musicConfig.genres ? musicConfig.genres
: [], : [],
voice: musicConfig?.voice || "", voice: Array.isArray(musicConfig?.voice) ? musicConfig.voice : [],
instruments: Array.isArray(musicConfig?.instruments) instruments: Array.isArray(musicConfig?.instruments)
? musicConfig.instruments ? musicConfig.instruments
: [], : [],
tempo: musicConfig?.tempo || "", tempo: musicConfig?.tempo || "",
}, },
musicStatus: null, musicStatus: null,
sunoTaskId: firebase.firestore.FieldValue.delete(),
musicUrls: firebase.firestore.FieldValue.delete(),
}); });
} }
} catch (e) {} } catch (e) {}
+20 -13
View File
@@ -7,13 +7,18 @@ import { FONT_FAMILY } from "../../styles/Fonts";
import { BlurView } from "expo-blur"; import { BlurView } from "expo-blur";
import { VOICE } from "../../data/data"; import { VOICE } from "../../data/data";
const CustomizeVoice = ({ selected, setSelected }) => { const CustomizeVoice = ({ selected = {}, setSelected }) => {
const [containerLayout, setContainerLayout] = useState(null); const [containerLayout, setContainerLayout] = useState(null);
const onPressSelect = (item) => { // Toggle select: only 1 per category (section.title)
const onPressSelect = (category, item) => {
if (!setSelected) return; if (!setSelected) return;
if (selected === item) setSelected(null); const current = selected && typeof selected === "object" ? selected : {};
else setSelected(item); // 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 ( return (
@@ -32,25 +37,26 @@ const CustomizeVoice = ({ selected, setSelected }) => {
sections={VOICE} sections={VOICE}
showsVerticalScrollIndicator={false} showsVerticalScrollIndicator={false}
contentContainerStyle={styles.contentContainer} contentContainerStyle={styles.contentContainer}
renderItem={({ item }) => { renderItem={({ item, section }) => {
const selectedItem = selected === item; const cat = section?.title;
const selectedItem = selected?.[cat] === item;
return ( return (
<CreateLyricsHeader <CreateLyricsHeader
onPress={() => onPressSelect(item)} onPress={() => onPressSelect(cat, item)}
tint={selectedItem ? "default" : "dark"} tint={selectedItem ? "default" : "dark"}
colors={ // Ne pas changer le blur; garder fond transparent comme ChooseInstruments
selectedItem colors={[Palette.tran, Palette.tran]}
? ["#FFFFFF00", "#FFFFFF"]
: [Palette.tran, Palette.tran]
}
containerStyle={{ containerStyle={{
...styles.itemContainer, ...styles.itemContainer,
borderWidth: selectedItem ? 2 : 0,
borderColor: selectedItem ? "#F94697" : "transparent",
}} }}
> >
<View <View
style={{ style={{
paddingVertical: 6, height: 40,
justifyContent: "center",
}} }}
> >
<Text style={styles.itemText}>{item}</Text> <Text style={styles.itemText}>{item}</Text>
@@ -89,6 +95,7 @@ const styles = StyleSheet.create({
paddingBottom: 50, paddingBottom: 50,
}, },
itemContainer: { itemContainer: {
height: 54,
backgroundColor: Palette.glass, backgroundColor: Palette.glass,
borderRadius: 14, borderRadius: 14,
overflow: "hidden", overflow: "hidden",
+59 -23
View File
@@ -25,8 +25,9 @@ const GeneratingSong = () => {
const progressTimerRef = useRef(null); const progressTimerRef = useRef(null);
const navigatedRef = useRef(false); const navigatedRef = useRef(false);
const isFocused = useIsFocused(); const isFocused = useIsFocused();
const lastConfigKeyRef = useRef(null);
const askedRef = useRef(false); const askedRef = useRef(false);
const callingRef = useRef(false);
const localStartRef = useRef(null);
// project loaded from provider // project loaded from provider
@@ -39,26 +40,49 @@ const GeneratingSong = () => {
progressTimerRef.current = null; 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); setProgress(100);
clearTimer(); clearTimer();
return () => 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 update = () => {
const startDate = selectedProject?.generationStartAt?.toDate const startDate = resolveStartDate();
? selectedProject.generationStartAt.toDate() if (!startDate) {
: new Date(selectedProject?.generationStartAt || Date.now()); setProgress(0);
return;
}
const elapsed = moment().diff(moment(startDate)); const elapsed = moment().diff(moment(startDate));
const raw = Math.floor((elapsed / totalMs) * 100); const raw = Math.floor((elapsed / totalMs) * 100);
// While status is GENERATING, block visual progress at 99% // While status is GENERATING, block visual progress at 99%
const pct = Math.max(0, Math.min(99, raw)); const pct = Math.max(0, Math.min(99, raw));
setProgress(pct); setProgress(pct);
}; };
update(); update();
clearTimer(); clearTimer();
progressTimerRef.current = setInterval(update, 1000); progressTimerRef.current = setInterval(update, 1000);
return () => clearTimer(); return () => clearTimer();
}, [selectedProject?.musicStatus]); }, [selectedProject?.musicStatus, selectedProject?.generationStartAt]);
// Auto navigate to SongReady when generation completed // Auto navigate to SongReady when generation completed
useEffect(() => { useEffect(() => {
@@ -76,7 +100,7 @@ const GeneratingSong = () => {
title: cfg?.title || "", title: cfg?.title || "",
lyrics: Array.isArray(cfg?.lyrics) ? cfg.lyrics : [], lyrics: Array.isArray(cfg?.lyrics) ? cfg.lyrics : [],
genres: Array.isArray(cfg?.genres) ? cfg.genres : [], genres: Array.isArray(cfg?.genres) ? cfg.genres : [],
voice: cfg?.voice || "", voice: Array.isArray(cfg?.voice) ? cfg.voice : [],
instruments: Array.isArray(cfg?.instruments) ? cfg.instruments : [], instruments: Array.isArray(cfg?.instruments) ? cfg.instruments : [],
tempo: cfg?.tempo || "", 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(() => { useEffect(() => {
if (!isFocused) return; 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 (titleOk && isIdle && !askedRef.current) {
if (lastConfigKeyRef.current !== key) {
lastConfigKeyRef.current = key;
askedRef.current = false;
}
const canAsk =
!!selectedProject?.title && selectedProject?.musicStatus !== "GENERATING";
if (canAsk && !askedRef.current) {
askedRef.current = true; askedRef.current = true;
Alert.alert("Attention", "Une génération va être lancée. Continuer ?", [ Alert.alert("Attention", "Une génération va être lancée. Continuer ?", [
{ {
text: "Non", text: "Non",
style: "cancel", style: "cancel",
onPress: () => {
askedRef.current = false;
},
}, },
{ { text: "Oui", onPress: () => startMusicGenerationOnce() },
text: "Oui",
onPress: () => startMusicGeneration(),
},
]); ]);
} }
}, [ }, [
isFocused, isFocused,
selectedProject?.title, selectedProject?.title,
selectedProject?.musicStatus, selectedProject?.musicStatus,
effectiveConfig,
]); ]);
return ( return (
+1 -1
View File
@@ -8,7 +8,7 @@ import { goBack } from "../../navigation/NavigationService";
import { gutters, Palette } from "../../styles"; import { gutters, Palette } from "../../styles";
import { FONT_FAMILY } from "../../styles/Fonts"; import { FONT_FAMILY } from "../../styles/Fonts";
import GradientButton from "../../components/GradientButton"; import GradientButton from "../../components/GradientButton";
import { useRoute } from "@react-navigation/core"; import { useRoute } from "@react-navigation/native";
const Regenerate = () => { const Regenerate = () => {
const params = useRoute().params; const params = useRoute().params;
+6 -1
View File
@@ -51,8 +51,13 @@ const EmotionConvey = ({
<View style={{ paddingHorizontal: 5 }}> <View style={{ paddingHorizontal: 5 }}>
<CreateLyricsHeader <CreateLyricsHeader
colors={item.color} colors={item.color}
tint={selectedItem ? "default" : "dark"} tint={"dark"}
onPress={() => onPressSelect(item)} onPress={() => onPressSelect(item)}
containerStyle={{
borderWidth: selectedItem ? 2 : 0,
borderColor: selectedItem ? "#F94697" : "transparent",
borderRadius: 14,
}}
> >
<Text <Text
style={{ style={{
+5 -6
View File
@@ -37,18 +37,16 @@ const Goals = ({ selected: selectedProp, setSelected: setSelectedProp, otherObje
<CreateLyricsHeader <CreateLyricsHeader
onPress={() => onPressSelect(item)} onPress={() => onPressSelect(item)}
tint={selectedItem ? "default" : "dark"} tint={selectedItem ? "default" : "dark"}
colors={ colors={[Palette.tran, Palette.tran]}
selectedItem
? ["#FFFFFF00", "#FFFFFF"]
: [Palette.tran, Palette.tran]
}
containerStyle={{ containerStyle={{
...styles.itemContainer, ...styles.itemContainer,
borderWidth: selectedItem ? 2 : 0,
borderColor: selectedItem ? "#F94697" : "transparent",
}} }}
> >
<View <View
style={{ style={{
height: 40, height: 54,
...Style.containerCenter, ...Style.containerCenter,
}} }}
> >
@@ -81,6 +79,7 @@ const styles = StyleSheet.create({
paddingBottom: 50, paddingBottom: 50,
}, },
itemContainer: { itemContainer: {
height: 54,
borderRadius: 14, borderRadius: 14,
shadowColor: "#00000040", shadowColor: "#00000040",
shadowOffset: { shadowOffset: {
+74 -32
View File
@@ -1,5 +1,5 @@
import { View, ScrollView, Alert } from "react-native"; 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 Page from "../../layouts/Page";
import MusicLandHeader from "../../components/MusicLandHeader"; import MusicLandHeader from "../../components/MusicLandHeader";
import { navigate } from "../../navigation/NavigationService"; import { navigate } from "../../navigation/NavigationService";
@@ -61,37 +61,6 @@ const Lyrics = ({ navigation }) => {
}, [projectTitle, projectLyrics, projectConfig]); }, [projectTitle, projectLyrics, projectConfig]);
const [titleValue, setTitleValue] = useState(initial.title || ""); 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 [sections, setSections] = useState(initial.sections || []);
const setSectionAt = (index, value) => { const setSectionAt = (index, value) => {
setSections((prev) => { setSections((prev) => {
@@ -158,6 +127,79 @@ const Lyrics = ({ navigation }) => {
s.lyrics === normalizedNewLyrics[i]?.lyrics, 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 = { const baseData = {
title: titleTrimmed, title: titleTrimmed,
titleLower: titleTrimmed.toLowerCase(), titleLower: titleTrimmed.toLowerCase(),
+4 -6
View File
@@ -33,18 +33,16 @@ const Rhymes = ({ selected: selectedProp, setSelected: setSelectedProp }) => {
key={index} key={index}
onPress={() => onPressSelect(item)} onPress={() => onPressSelect(item)}
tint={selectedItem ? "default" : "dark"} tint={selectedItem ? "default" : "dark"}
colors={ colors={[Palette.tran, Palette.tran]}
selectedItem
? ["#FFFFFF00", "#FFFFFF"]
: [Palette.tran, Palette.tran]
}
containerStyle={{ containerStyle={{
...styles.itemContainer, ...styles.itemContainer,
borderWidth: selectedItem ? 2 : 0,
borderColor: selectedItem ? "#F94697" : "transparent",
}} }}
> >
<View <View
style={{ style={{
height: 40, height: 54,
...Style.containerCenter, ...Style.containerCenter,
paddingHorizontal: 14, paddingHorizontal: 14,
}} }}
+3 -5
View File
@@ -40,13 +40,11 @@ const SongStructure = ({
<CreateLyricsHeader <CreateLyricsHeader
onPress={() => onPressSelect(item)} onPress={() => onPressSelect(item)}
tint={selectedItem ? "default" : "dark"} tint={selectedItem ? "default" : "dark"}
colors={ colors={[Palette.tran, Palette.tran]}
selectedItem
? ["#FFFFFF00", "#FFFFFF"]
: [Palette.tran, Palette.tran]
}
containerStyle={{ containerStyle={{
...styles.itemContainer, ...styles.itemContainer,
borderWidth: selectedItem ? 2 : 0,
borderColor: selectedItem ? "#F94697" : "transparent",
}} }}
> >
<View <View
+3 -5
View File
@@ -43,15 +43,13 @@ const SongStyle = ({
return ( return (
<CreateLyricsHeader <CreateLyricsHeader
colors={ colors={[Palette.tran, Palette.tran]}
selectedItem
? ["#FFFFFF00", "#FFFFFF"]
: [Palette.tran, Palette.tran]
}
tint={selectedItem ? "default" : "dark"} tint={selectedItem ? "default" : "dark"}
onPress={() => onPressSelect(item.title)} onPress={() => onPressSelect(item.title)}
containerStyle={{ containerStyle={{
...styles.itemContainer, ...styles.itemContainer,
borderWidth: selectedItem ? 2 : 0,
borderColor: selectedItem ? "#F94697" : "transparent",
}} }}
> >
<View style={{ paddingVertical: 6 }}> <View style={{ paddingVertical: 6 }}>