diff --git a/list_res.json b/list_res.json new file mode 100644 index 0000000..cb591d0 --- /dev/null +++ b/list_res.json @@ -0,0 +1 @@ +{"success":true,"status":200,"message":"common.success","data":{"data":[{"id":"29de08a8-f4f5-40ae-927f-cf28f37d5d8b","title":"Test Std Project","prompt":"Belgesel","status":"DRAFT","progress":0,"thumbnailUrl":null,"finalVideoUrl":null,"language":"tr","videoStyle":"CINEMATIC","aspectRatio":"PORTRAIT_9_16","targetDuration":60,"creditsUsed":0,"createdAt":"2026-04-05T16:59:50.013Z","updatedAt":"2026-04-05T16:59:50.013Z","completedAt":null},{"id":"4542f24c-8466-428a-ad07-1cfcc229f903","title":"Test Project","prompt":"Uzay hakkında bir belgesel","status":"DRAFT","progress":0,"thumbnailUrl":null,"finalVideoUrl":null,"language":"tr","videoStyle":"CINEMATIC","aspectRatio":"PORTRAIT_9_16","targetDuration":60,"creditsUsed":0,"createdAt":"2026-04-05T16:53:29.938Z","updatedAt":"2026-04-05T16:53:29.938Z","completedAt":null},{"id":"0877428b-68e5-4882-923c-e97183c2f0a1","title":"🚨 A neurotechnology breakthrough may have just turned science fiction into reality","prompt":"[X/Twitter Kaynak İçerik]\nYazar: @NightSkyNow (Night Sky Now)\nEtkileşim: 8.2K beğeni, 1.1K retweet, 2.5M görüntülenme\n\nTweet İçeriği:\n🚨 A neurotechnology breakthrough may have just turned science fiction into reality. A Silicon Valley startup called REMspace claims to have achieved the first successful communication between two people during a lucid dream — an unprecedented step in the study of consciousness and sleep. \n\nUsing EEG monitors, eye-tracking sensors, and a custom-coded dream language named “Remmyo,” researchers reportedly managed to transmit a single word from one dreamer to another — all while both remained asleep and lucid. The experiment represents a one-way exchange but demonstrates that structured messages could, in theory, travel between two dreaming minds.\n\nCEO Michael Raduga says this is “just the beginning,” envisioning a future where dream-to-dream communication becomes a new frontier of neurotechnology. If expanded, this could revolutionize how we study memory, creativity, trauma therapy, and even human connection in subconscious states.\n\nReference:\n\nRaduga, M., Shashkov, A., & Vanin, A. (2024). Two-way control of a virtual avatar from lucid dreams. International Journal of Dream Research, 17(1). \n\n#FutureTech #Neuroscience #MindSharing\n\nMedya: 1 fotoğraf\nReferans Görseller (senaryoda kullanılabilir):\n Görsel 1: https://pbs.twimg.com/media/G_iVOtraIAAxL6u.jpg?name=orig\n\nBu tweet içeriğinden etkileyici bir shorts videosu senaryosu oluştur. Tweet'in viral olma nedenlerini analiz et ve izleyiciyi yakalayan bir anlatım kur. Tweet'teki görselleri referans olarak kullan, ayrıca AI ile yeni görseller de üret.","status":"DRAFT","progress":0,"thumbnailUrl":null,"finalVideoUrl":null,"language":"tr","videoStyle":"CINEMATIC","aspectRatio":"PORTRAIT_9_16","targetDuration":60,"creditsUsed":0,"createdAt":"2026-04-05T15:59:35.665Z","updatedAt":"2026-04-05T16:00:12.804Z","completedAt":null},{"id":"a8da2d35-712d-49ce-8422-405c5dd114cb","title":"🕳️ Evren Hakkında Bildiklerimizi Alt Üst Edebilecek Kara Delik Sırrı…","prompt":"[X/Twitter Kaynak İçerik]\nYazar: @DeepTechTR (DeepTechTR 🇹🇷)\nEtkileşim: 20 beğeni, 3 retweet, 1.4K görüntülenme\n\nTweet İçeriği:\n🕳️ Evren Hakkında Bildiklerimizi Alt Üst Edebilecek Kara Delik Sırrı…\n\nUzayda, yerçekiminin o kadar güçlü olduğu, ışığın bile kaçamadığı bir yer hayal edin. Bunlar kara delikler, evrenin en büyük gizemleri. Ama bilim insanlarının takıntılı olduğu bir nokta var: Bir kara delik tarafından yutulan tüm bilgilere ne oluyor? Fiziğe göre, bilgi öylece yok olamaz. Yine de, kara delikler her şeyi siliyor gibi görünüyor.\n\nBu bilmeceye Kara Delik Bilgi Paradoksu deniyor ve gerçekliğin temellerini sarsıyor. Bilgi yok olursa, kuantum fiziğinin yasaları çöker. Eğer bir şekilde hayatta kalırsa, bu kara deliklerin kozmik çöp kutularından ziyade kozmik kasalar gibi olduğu anlamına gelebilir.\n\nBazı bilim insanları cevabın kara deliğin kenarında, olay ufku adı verilen gizemli ince bir sınırda yattığını, burada gerçekliğin kendisinin yeniden yazılabileceğini öne sürüyor. Diğerleri ise holografik evrenler veya gizli boyutlar gibi akıl almaz fikirlere işaret ediyor.\n\n Her kara delik, zaman, uzay ve gerçekliğin kendisi hakkında bildiğimizi sandığımız her şeye meydan okuyan sırlar saklıyor olabilir. Soru şu... çok geç olmadan onları ortaya çıkarabilecek miyiz?\n\nMerak mı ediyorsunuz? Yalnız değilsiniz. Evren sırlarını fısıldıyor... dinliyor musunuz?\n\nMedya: 1 fotoğraf\nReferans Görseller (senaryoda kullanılabilir):\n Görsel 1: https://pbs.twimg.com/media/HDDs5eEWIAAULoL.jpg?name=orig\n\nBu tweet içeriğinden etkileyici bir shorts videosu senaryosu oluştur. Tweet'in viral olma nedenlerini analiz et ve izleyiciyi yakalayan bir anlatım kur. Tweet'teki görselleri referans olarak kullan, ayrıca AI ile yeni görseller de üret.","status":"PENDING","progress":0,"thumbnailUrl":null,"finalVideoUrl":null,"language":"tr","videoStyle":"CINEMATIC","aspectRatio":"PORTRAIT_9_16","targetDuration":74,"creditsUsed":0,"createdAt":"2026-04-05T14:38:29.145Z","updatedAt":"2026-04-05T14:39:48.247Z","completedAt":null},{"id":"e1d8b5b7-7d92-4bf0-b26a-1589048bec51","title":"Kara deliklerin gizemi","prompt":"Kara deliklerin gizemi","status":"PENDING","progress":0,"thumbnailUrl":null,"finalVideoUrl":null,"language":"tr","videoStyle":"CINEMATIC","aspectRatio":"PORTRAIT_9_16","targetDuration":60,"creditsUsed":0,"createdAt":"2026-04-05T14:31:02.784Z","updatedAt":"2026-04-05T14:33:05.444Z","completedAt":null}],"meta":{"total":5,"page":1,"limit":10,"totalPages":1}},"errors":[]} \ No newline at end of file diff --git a/package.json b/package.json index 3dc2e8b..29bf9b6 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "db:migrate": "npx prisma migrate deploy", "db:reset": "npx prisma migrate reset --force" }, - "dependencies": { "@aws-sdk/client-s3": "^3.964.0", "@google/genai": "^1.35.0", @@ -39,6 +38,7 @@ "@nestjs/throttler": "^6.5.0", "@nestjs/websockets": "^11.1.17", "@prisma/client": "^5.22.0", + "@types/sharp": "^0.32.0", "bcrypt": "^6.0.0", "bullmq": "^5.66.4", "cache-manager": "^7.2.7", @@ -57,6 +57,7 @@ "prisma": "^5.22.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", + "sharp": "^0.34.5", "socket.io": "^4.8.3", "stripe": "^21.0.1", "zod": "^4.3.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 056cb25..272e1c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: '@prisma/client': specifier: ^5.22.0 version: 5.22.0(prisma@5.22.0) + '@types/sharp': + specifier: ^0.32.0 + version: 0.32.0 bcrypt: specifier: ^6.0.0 version: 6.0.0 @@ -110,6 +113,9 @@ importers: rxjs: specifier: ^7.8.1 version: 7.8.2 + sharp: + specifier: ^0.34.5 + version: 0.34.5 socket.io: specifier: ^4.8.3 version: 4.8.3 @@ -645,6 +651,159 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/ansi@1.0.2': resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} engines: {node: '>=18'} @@ -1619,6 +1778,10 @@ packages: '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + '@types/sharp@0.32.0': + resolution: {integrity: sha512-OOi3kL+FZDnPhVzsfD37J88FNeZh6gQsGcLc95NbeURRGvmSjeXiDcyWzF2o3yh/gQAUn2uhh/e+CPCa5nwAxw==} + deprecated: This is a stub types definition. sharp provides its own type definitions, so you do not need this installed. + '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -3754,6 +3917,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5065,6 +5232,102 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.9.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/ansi@1.0.2': {} '@inquirer/checkbox@4.3.2(@types/node@22.19.15)': @@ -6251,6 +6514,10 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 22.19.15 + '@types/sharp@0.32.0': + dependencies: + sharp: 0.34.5 + '@types/stack-utils@2.0.3': {} '@types/superagent@8.1.9': @@ -6997,8 +7264,7 @@ snapshots: depd@2.0.0: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} detect-newline@3.1.0: {} @@ -8633,6 +8899,37 @@ snapshots: setprototypeof@1.2.0: {} + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 diff --git a/proj_res.json b/proj_res.json new file mode 100644 index 0000000..ff558bf --- /dev/null +++ b/proj_res.json @@ -0,0 +1 @@ +{"success":false,"status":400,"message":"Tweet çekilemedi (3 deneme): FXTwitter HTTP 404: Not Found","data":null,"errors":[],"stack":"BadRequestException: Tweet çekilemedi (3 deneme): FXTwitter HTTP 404: Not Found\n at XTwitterService.fetchWithRetry (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/x-twitter/x-twitter.service.ts:364:11)\n at process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n at async XTwitterService.fetchTweet (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/x-twitter/x-twitter.service.ts:63:22)\n at async XTwitterService.previewTweet (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/x-twitter/x-twitter.service.ts:91:19)\n at async ProjectsService.createFromTweet (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/projects/projects.service.ts:352:21)"} \ No newline at end of file diff --git a/src/modules/projects/projects.controller.ts b/src/modules/projects/projects.controller.ts index 93a221d..4eb3130 100644 --- a/src/modules/projects/projects.controller.ts +++ b/src/modules/projects/projects.controller.ts @@ -184,4 +184,40 @@ export class ProjectsController { this.logger.log(`Sahne yeniden üretiliyor: ${sceneId} (proje: ${id})`); return this.projectsService.regenerateScene(userId, id, sceneId); } + + /** + * Sahne için ID bazında görsel üret (Gemini AI). + * Kullanıcı custom prompt sağlarsa, önce prompt güncellenir ardından resim üretilir. + */ + @Post(':id/scenes/:sceneId/generate-image') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Sahne görselini üret' }) + @ApiResponse({ status: 200, description: 'Görsel üretildi' }) + async generateSceneImage( + @Param('id', ParseUUIDPipe) id: string, + @Param('sceneId', ParseUUIDPipe) sceneId: string, + @Body() body: { customPrompt?: string }, + @Req() req: any, + ) { + const userId = req.user?.id || req.user?.sub; + this.logger.log(`Sahne görseli üretiliyor: ${sceneId} (proje: ${id})`); + return this.projectsService.generateSceneImage(userId, id, sceneId, body?.customPrompt); + } + + /** + * Sahne görselini 4K olarak yeniden boyutlandırır (Upscale) + */ + @Post(':id/scenes/:sceneId/upscale-image') + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Sahne görselini upscale (4K) yap' }) + @ApiResponse({ status: 200, description: 'Görsel başarıyla upscale edildi' }) + async upscaleSceneImage( + @Param('id', ParseUUIDPipe) id: string, + @Param('sceneId', ParseUUIDPipe) sceneId: string, + @Req() req: any, + ) { + const userId = req.user?.id || req.user?.sub; + this.logger.log(`Sahne görseli upscale ediliyor: ${sceneId} (proje: ${id})`); + return this.projectsService.upscaleSceneImage(userId, id, sceneId); + } } diff --git a/src/modules/projects/projects.module.ts b/src/modules/projects/projects.module.ts index ca3fa74..0c359bc 100644 --- a/src/modules/projects/projects.module.ts +++ b/src/modules/projects/projects.module.ts @@ -4,9 +4,11 @@ import { ProjectsService } from './projects.service'; import { VideoAiModule } from '../video-ai/video-ai.module'; import { VideoQueueModule } from '../video-queue/video-queue.module'; import { XTwitterModule } from '../x-twitter/x-twitter.module'; +import { GeminiModule } from '../gemini/gemini.module'; +import { StorageModule } from '../storage/storage.module'; @Module({ - imports: [VideoAiModule, VideoQueueModule, XTwitterModule], + imports: [VideoAiModule, VideoQueueModule, XTwitterModule, GeminiModule, StorageModule], controllers: [ProjectsController], providers: [ProjectsService], exports: [ProjectsService], diff --git a/src/modules/projects/projects.service.ts b/src/modules/projects/projects.service.ts index 82c6eed..7e123a9 100644 --- a/src/modules/projects/projects.service.ts +++ b/src/modules/projects/projects.service.ts @@ -7,9 +7,14 @@ import { import { TransitionType } from '@prisma/client'; import { PrismaService } from '../../database/prisma.service'; import { VideoAiService } from '../video-ai/video-ai.service'; +import { VideoQueueModule } from '../video-queue/video-queue.module'; import { VideoGenerationProducer } from '../video-queue/video-generation.producer'; import { XTwitterService } from '../x-twitter/x-twitter.service'; +import { GeminiService } from '../gemini/gemini.service'; +import { StorageService } from '../storage/storage.service'; import { CreateProjectDto, UpdateProjectDto, CreateFromTweetDto } from './dto/project.dto'; +import sharp from 'sharp'; +import * as fs from 'fs/promises'; interface FindAllOptions { page: number; @@ -26,6 +31,8 @@ export class ProjectsService { private readonly videoAiService: VideoAiService, private readonly videoGenerationProducer: VideoGenerationProducer, private readonly xTwitterService: XTwitterService, + private readonly geminiService: GeminiService, + private readonly storageService: StorageService, ) {} async create(userId: string, dto: CreateProjectDto) { @@ -140,9 +147,10 @@ export class ProjectsService { async update(userId: string, projectId: string, dto: UpdateProjectDto) { const project = await this.findOne(userId, projectId); - if (project.status !== 'DRAFT') { + const activeStatuses = ['PENDING', 'GENERATING_MEDIA', 'RENDERING']; + if (activeStatuses.includes(project.status)) { throw new BadRequestException( - `Sadece DRAFT durumundaki projeler güncellenebilir. Mevcut durum: ${project.status}`, + `İşlem devam ederken proje güncellenemez. Mevcut durum: ${project.status}`, ); } @@ -175,9 +183,10 @@ export class ProjectsService { async generateScript(userId: string, projectId: string) { const project = await this.findOne(userId, projectId); - if (project.status !== 'DRAFT') { + const activeStatuses = ['PENDING', 'GENERATING_MEDIA', 'RENDERING']; + if (activeStatuses.includes(project.status)) { throw new BadRequestException( - 'Senaryo sadece DRAFT durumundaki projeler için üretilebilir.', + `İşlem devam ederken senaryo üretilemez. Mevcut durum: ${project.status}`, ); } @@ -486,9 +495,10 @@ export class ProjectsService { // Proje sahipliğini doğrula const project = await this.findOne(userId, projectId); - if (project.status !== 'DRAFT' && project.status !== 'FAILED') { + const activeStatuses = ['PENDING', 'GENERATING_MEDIA', 'RENDERING']; + if (activeStatuses.includes(project.status)) { throw new BadRequestException( - `Sahneler yalnızca DRAFT veya FAILED durumunda düzenlenebilir. Mevcut: ${project.status}`, + `İşlem devam ederken sahneler düzenlenemez. Mevcut durum: ${project.status}`, ); } @@ -520,9 +530,10 @@ export class ProjectsService { async regenerateScene(userId: string, projectId: string, sceneId: string) { const project = await this.findOne(userId, projectId); - if (project.status !== 'DRAFT' && project.status !== 'FAILED') { + const activeStatuses = ['PENDING', 'GENERATING_MEDIA', 'RENDERING']; + if (activeStatuses.includes(project.status)) { throw new BadRequestException( - `Sahneler yalnızca DRAFT veya FAILED durumunda yeniden üretilebilir.`, + `İşlem devam ederken sahneler yeniden üretilemez. Mevcut durum: ${project.status}`, ); } @@ -567,4 +578,131 @@ Sadece bu tek sahneyi üret. JSON formatında: this.logger.log(`Sahne yeniden üretildi: ${sceneId} (proje: ${projectId})`); return updated; } + + async generateSceneImage(userId: string, projectId: string, sceneId: string, customPrompt?: string) { + const project = await this.findOne(projectId, userId); + const scene = project.scenes.find((s) => s.id === sceneId); + if (!scene) { + throw new NotFoundException('Sahne bulunamadı'); + } + + if (customPrompt && customPrompt !== scene.visualPrompt) { + // First update the prompt + await this.updateScene(userId, projectId, sceneId, { visualPrompt: customPrompt }); + scene.visualPrompt = customPrompt; + } + + this.logger.log(`Sahne görseli üretiliyor: ${sceneId} (proje: ${projectId})`); + + const aspectRatioMap: Record = { + 'PORTRAIT_9_16': '9:16', + 'LANDSCAPE_16_9': '16:9', + 'SQUARE_1_1': '1:1', + }; + const mappedRatio = aspectRatioMap[project.aspectRatio] || '9:16'; + + // Görüntüyü üret + const imageResult = await this.geminiService.generateImageForScene( + scene.visualPrompt, + project.videoStyle, + mappedRatio, + ); + + if (!imageResult) { + throw new BadRequestException('Görsel üretilemedi, servis yanıt vermedi'); + } + + // Storage'a kaydet + const key = this.storageService.getSceneImageKey(projectId, scene.order); + await this.storageService.upload(key, imageResult.buffer, imageResult.mimeType); + const url = this.storageService.getPublicUrl(key); + + // MediaRecord oluştur veya güncelle + let mediaAsset = scene.mediaAssets.find(m => m.type === 'THUMBNAIL'); + let mediaId = mediaAsset?.id; + if (!mediaId) { + const media = await this.db.mediaAsset.create({ + data: { + projectId, + type: 'THUMBNAIL', + url: url, + fileName: `scene-${scene.order}.png`, + sizeBytes: imageResult.buffer.length, + mimeType: imageResult.mimeType, + sceneId: scene.id, + }, + }); + mediaId = media.id; + } else { + await this.db.mediaAsset.update({ + where: { id: mediaId }, + data: { url: url, sizeBytes: imageResult.buffer.length }, + }); + } + + const updated = await this.db.scene.findUnique({ + where: { id: sceneId }, + include: { mediaAssets: true }, + }); + return updated; + } + + async upscaleSceneImage(userId: string, projectId: string, sceneId: string) { + const project = await this.findOne(projectId, userId); + const scene = project.scenes.find((s) => s.id === sceneId); + if (!scene) { + throw new NotFoundException('Sahne bulunamadı'); + } + + const mediaAsset = scene.mediaAssets.find(m => m.type === 'THUMBNAIL'); + let mediaId = mediaAsset?.id; + if (!mediaId) { + throw new BadRequestException('Bu sahne için upscaled edilecek görsel bulunamadı.'); + } + + const media = await this.db.mediaAsset.findUnique({ where: { id: mediaId } }); + if (!media) throw new NotFoundException('Medya kaydı bulunamadı'); + + this.logger.log(`Sahne görseli upscaled ediliyor (Sharp ile simülasyon): ${sceneId}`); + + const key = this.storageService.getSceneImageKey(projectId, scene.order); + const absPath = this.storageService.getAbsolutePath(key); + + try { + const buffer = await fs.readFile(absPath); + + // Determine dimensions based on ratio + let width = 3840; + let height = 2160; + if (project.aspectRatio === 'PORTRAIT_9_16') { + width = 2160; + height = 3840; + } else if (project.aspectRatio === 'SQUARE_1_1') { + width = 2160; + height = 2160; + } + + // Upscale logic simulated natively locally using Sharp + const upscaledBuffer = await sharp(buffer) + .resize(width, height, { fit: 'cover', kernel: 'lanczos3' }) + .toFormat('png') + .toBuffer(); + + // Overwrite the image + await this.storageService.upload(key, upscaledBuffer, 'image/png'); + + await this.db.mediaAsset.update({ + where: { id: mediaId }, + data: { sizeBytes: upscaledBuffer.length }, + }); + + return await this.db.scene.findUnique({ + where: { id: sceneId }, + include: { mediaAssets: true }, + }); + } catch (error) { + this.logger.error(`Upscale sırasında hata: ${error.message}`); + throw new BadRequestException('Görsel bulunamadı veya işlenemedi.'); + } + } } diff --git a/src/modules/video-ai/video-ai.service.ts b/src/modules/video-ai/video-ai.service.ts index 63e42e2..26733c1 100644 --- a/src/modules/video-ai/video-ai.service.ts +++ b/src/modules/video-ai/video-ai.service.ts @@ -7,6 +7,7 @@ export interface ScriptGenerationInput { targetDurationSeconds: number; language: string; videoStyle: string; + aspectRatio?: string; // PORTRAIT_9_16 | LANDSCAPE_16_9 | SQUARE_1_1 referenceUrl?: string; seoKeywords?: string[]; /** X/Twitter kaynaklı içerik — tweet verisi */ @@ -31,6 +32,73 @@ export interface GeneratedScene { ambientSoundPrompt?: string; // AudioGen: sahne bazlı ses efekti } +export interface StyleDNA { + reference: string; + lighting: string; + lens: string; + color: string; + texture: string; +} + +/** Desteklenen tüm video stilleri — frontend stil seçimi için export */ +export const VIDEO_STYLES = [ + // === Sinematik & Film === + { value: 'CINEMATIC', label: 'Sinematik', category: 'Film & Sinema', icon: '🎬' }, + { value: 'DOCUMENTARY', label: 'Belgesel', category: 'Film & Sinema', icon: '📹' }, + { value: 'STORYTELLING', label: 'Hikâye Anlatımı', category: 'Film & Sinema', icon: '📖' }, + { value: 'NEWS', label: 'Haber', category: 'Film & Sinema', icon: '📰' }, + { value: 'ARTISTIC', label: 'Sanatsal', category: 'Film & Sinema', icon: '🎨' }, + { value: 'NOIR', label: 'Film Noir', category: 'Film & Sinema', icon: '🖤' }, + { value: 'VLOG', label: 'Vlog (Günlük)', category: 'Film & Sinema', icon: '📱' }, + // === Animasyon === + { value: 'ANIME', label: 'Anime', category: 'Animasyon', icon: '⛩️' }, + { value: 'ANIMATION_3D', label: '3D Animasyon (Pixar)', category: 'Animasyon', icon: '🧊' }, + { value: 'ANIMATION_2D', label: '2D Animasyon (Klasik)', category: 'Animasyon', icon: '✏️' }, + { value: 'STOP_MOTION', label: 'Stop Motion', category: 'Animasyon', icon: '🧸' }, + { value: 'MOTION_COMIC', label: 'Hareketli Çizgi Roman', category: 'Animasyon', icon: '💥' }, + { value: 'CARTOON', label: 'Karikatür / Çizgi Film', category: 'Animasyon', icon: '🎭' }, + { value: 'CLAYMATION', label: 'Claymation (Kil Animasyon)', category: 'Animasyon', icon: '🏺' }, + { value: 'PIXEL_ART', label: 'Pixel Art (8-bit)', category: 'Animasyon', icon: '👾' }, + { value: 'ISOMETRIC', label: 'İzometrik Animasyon', category: 'Animasyon', icon: '🔷' }, + // === Eğitim & Bilgi === + { value: 'EDUCATIONAL', label: 'Eğitim', category: 'Eğitim & Bilgi', icon: '🎓' }, + { value: 'INFOGRAPHIC', label: 'İnfografik', category: 'Eğitim & Bilgi', icon: '📊' }, + { value: 'WHITEBOARD', label: 'Whiteboard Animasyon', category: 'Eğitim & Bilgi', icon: '📝' }, + { value: 'EXPLAINER', label: 'Explainer Video', category: 'Eğitim & Bilgi', icon: '💡' }, + { value: 'DATA_VIZ', label: 'Veri Görselleştirme', category: 'Eğitim & Bilgi', icon: '📈' }, + // === Retro & Nostaljik === + { value: 'RETRO_80S', label: 'Retro 80s Synthwave', category: 'Retro & Nostaljik', icon: '🕹️' }, + { value: 'VINTAGE_FILM', label: 'Vintage Film (Super 8)', category: 'Retro & Nostaljik', icon: '📽️' }, + { value: 'VHS', label: 'VHS Aesthetic', category: 'Retro & Nostaljik', icon: '📼' }, + { value: 'POLAROID', label: 'Polaroid / Analog Fotoğraf', category: 'Retro & Nostaljik', icon: '📸' }, + { value: 'RETRO_90S', label: 'Retro 90s Y2K', category: 'Retro & Nostaljik', icon: '💿' }, + // === Sanat Akımları === + { value: 'WATERCOLOR', label: 'Suluboya', category: 'Sanat Akımları', icon: '🎨' }, + { value: 'OIL_PAINTING', label: 'Yağlı Boya', category: 'Sanat Akımları', icon: '🖌️' }, + { value: 'IMPRESSIONIST', label: 'Empresyonist', category: 'Sanat Akımları', icon: '🌅' }, + { value: 'POP_ART', label: 'Pop Art (Warhol)', category: 'Sanat Akımları', icon: '🎯' }, + { value: 'UKIYO_E', label: 'Ukiyo-e (Japon Ahşap Baskı)', category: 'Sanat Akımları', icon: '🏯' }, + { value: 'ART_DECO', label: 'Art Deco', category: 'Sanat Akımları', icon: '✨' }, + { value: 'SURREAL', label: 'Sürrealist (Dalí)', category: 'Sanat Akımları', icon: '🌀' }, + { value: 'COMIC_BOOK', label: 'Çizgi Roman (Marvel/DC)', category: 'Sanat Akımları', icon: '💬' }, + { value: 'SKETCH', label: 'Karakalem Çizim', category: 'Sanat Akımları', icon: '✍️' }, + // === Modern & Minimal === + { value: 'MINIMALIST', label: 'Minimalist (Apple)', category: 'Modern & Minimal', icon: '⚪' }, + { value: 'GLASSMORPHISM', label: 'Glassmorphism / Cam', category: 'Modern & Minimal', icon: '🔮' }, + { value: 'NEON', label: 'Neon Glow', category: 'Modern & Minimal', icon: '💜' }, + { value: 'CYBERPUNK', label: 'Cyberpunk', category: 'Modern & Minimal', icon: '🤖' }, + { value: 'STEAMPUNK', label: 'Steampunk', category: 'Modern & Minimal', icon: '⚙️' }, + { value: 'ABSTRACT', label: 'Soyut / Abstract', category: 'Modern & Minimal', icon: '🔵' }, + // === Fotoğrafik === + { value: 'PRODUCT', label: 'Ürün Fotoğrafçılığı', category: 'Fotoğrafik', icon: '📦' }, + { value: 'FASHION', label: 'Moda Fotoğrafçılığı', category: 'Fotoğrafik', icon: '👗' }, + { value: 'AERIAL', label: 'Havadan (Drone)', category: 'Fotoğrafik', icon: '🚁' }, + { value: 'MACRO', label: 'Makro / Yakın Çekim', category: 'Fotoğrafik', icon: '🔬' }, + { value: 'PORTRAIT', label: 'Portre Fotoğrafçılığı', category: 'Fotoğrafik', icon: '🧑' }, +] as const; + +export type VideoStyleKey = typeof VIDEO_STYLES[number]['value']; + export interface SeoMetadata { title: string; description: string; @@ -124,18 +192,208 @@ CONTENT QUALITY: - End with a thought that sticks — not a generic "like and subscribe" - Make the viewer feel smarter after watching -═══════════════════════════════════ -VISUAL PROMPTS (ALWAYS IN ENGLISH) -═══════════════════════════════════ +═══════════════════════════════════════════════════════════════ +VISUAL PROMPTS — 5-LAYER ARCHITECTURE™ (ALWAYS IN ENGLISH) +═══════════════════════════════════════════════════════════════ -Each scene's "visualPrompt" MUST be in English for Higgsfield AI. Write as detailed cinematic shot descriptions: -• Camera: close-up, extreme wide, aerial drone, POV, tracking, dolly forward, orbiting, slow tilt up -• Lighting: golden hour, chiaroscuro shadows, neon-lit, backlit silhouettes, warm amber, harsh high-contrast -• Atmosphere: misty, ethereal, vibrant saturated, dark moody, pristine, surreal dreamlike -• Motion: "slow zoom into," "camera glides across," "smooth push-in through," "sweeping pan revealing" -• Include textures, colors, environment, scale references -• NEVER: text, logos, watermarks, recognizable human faces, brand names -• Each prompt: 2-3 DETAILED sentences of rich visual description +Each scene's "visualPrompt" MUST be written in English. This field feeds directly into AI image/video generation models (Higgsfield, Flux, Kling). A weak, vague prompt produces generic stock-photo results. A layered, specific prompt produces cinematic-grade visuals. + +Every single visualPrompt you write MUST contain ALL 5 of these layers. No exceptions. If you skip any layer, the image will look generic and forgettable. + +━━━ LAYER 1: SUBJECT SPECIFICITY ━━━ +Describe WHAT is in the scene with extreme specificity. Never write vague descriptions. + +❌ BAD: "A woman standing outside" +❌ BAD: "A futuristic city at night" +✅ GOOD: "A woman in her late 30s wearing a long charcoal wool overcoat, standing on a rain-wet cobblestone sidewalk outside a dimly lit antiquarian bookstore, her left hand resting on a weathered wooden doorframe, a folded umbrella dripping water at her side" +✅ GOOD: "A sprawling cyberpunk megacity viewed from a rooftop garden 200 stories high, overgrown with glowing bioluminescent vines, holographic billboards in Japanese kanji flickering between the towers, autonomous flying vehicles weaving between glass skyscrapers connected by transparent skywalks" + +Rules: +• Name specific materials, textures, and surfaces ("brushed titanium", "cracked leather", "moss-covered stone") +• Include precise spatial relationships ("foreground", "middle-ground", "far background") +• Describe the environment with the same detail as the main subject +• Add small "lived-in" details that make scenes feel real ("coffee stain on the table", "dog-eared book pages", "condensation on glass") + +━━━ LAYER 2: MOOD & VISUAL REFERENCE ━━━ +Every image belongs to a visual universe. Define that universe with specific references. + +❌ BAD: "dark and moody" +❌ BAD: "cinematic look" +✅ GOOD: "Blade Runner 2049 color palette with heavy teal-and-amber contrast, Denis Villeneuve visual language, desolate monumental scale" +✅ GOOD: "Wes Anderson symmetry with pastel Easter-egg color palette, The Grand Budapest Hotel framing, whimsical yet melancholic tone, perfectly centered subjects" +✅ GOOD: "National Geographic documentary realism, Planet Earth II visual texture, intimate close-up wildlife photography, David Attenborough's visual signature" +✅ GOOD: "Studio Ghibli hand-painted watercolor backgrounds with lush green landscapes, Hayao Miyazaki cloudscapes, magical realism atmosphere" + +Mood reference options (use 2-3 per scene combined): +• Film references: "Blade Runner", "Interstellar", "Mad Max: Fury Road", "Spirited Away", "2001: A Space Odyssey", "The Grand Budapest Hotel", "Tenet", "Dune" +• Photography references: "Annie Leibovitz portrait lighting", "National Geographic close-up", "Sebastião Salgado black-and-white photojournalism", "Steve McCurry color richness" +• Art movements: "Renaissance chiaroscuro", "Impressionist broken color", "Art Deco geometry", "Japanese ukiyo-e woodblock", "Bauhaus minimalism", "Surrealist Dalí dreamscapes" +• Color systems: "70s Kodachrome warm tones", "Fujifilm Velvia saturated", "muted Scandinavian palette", "cyberpunk neon (magenta/teal/violet)", "earthy terracotta and sage" + +CRITICAL RULE: Once you establish a visual universe in Scene 1, ALL subsequent scenes MUST stay within that same visual world. If Scene 1 is Blade Runner, Scene 5 cannot suddenly look like Wes Anderson. + +━━━ LAYER 3: LIGHTING (Source, Direction, Quality) ━━━ +Lighting is the single most important factor in image quality. Never leave it to chance. + +You must specify THREE lighting properties: +A) SOURCE — Where is the light coming from? (sun, neon signs, candle, spotlight, overcast sky, monitor glow) +B) DIRECTION — From which side relative to camera? (from camera-left, backlighting from behind subject, overhead, from below, rim light from behind-right) +C) QUALITY — How does the light feel? (soft and diffused through curtains, harsh and directional, dappled through tree leaves, warm golden, cold blue-white clinical) + +❌ BAD: "good lighting" or just "golden hour" +✅ GOOD: "Late golden hour sunlight raking across the scene from camera-right at a low 15-degree angle, casting long dramatic shadows to the left, warm amber (3200K) backlighting creating a bright rim-light halo around the subject's silhouette, fill light bouncing softly off a nearby white wall on camera-left" +✅ GOOD: "Harsh overhead fluorescent tubes casting unflattering blue-white (6500K) light with hard-edged shadows directly below every object, a single warm desk lamp in the foreground creating a small pool of amber light that contrasts with the cold clinical environment" +✅ GOOD: "Diffused overcast daylight filtering through floor-to-ceiling frosted glass panels, creating even, shadowless illumination with a soft pearl-gray quality, punctuated by a single beam of direct sunlight breaking through a gap in the clouds and hitting the subject's hands" + +━━━ LAYER 4: COMPOSITION & CAMERA ━━━ +Tell exactly where the camera is, what lens is being used, and how the frame is organized. + +A) CAMERA POSITION: "eye-level", "low angle looking up (worm's eye)", "high angle looking down (bird's eye)", "overhead flat lay", "Dutch angle 15-degree tilt", "POV through character's eyes" +B) CAMERA DISTANCE: "extreme close-up on eyes", "medium close-up chest and up", "medium shot waist up", "full body shot", "wide establishing shot", "extreme wide showing entire landscape" +C) CAMERA MOVEMENT: "static locked-off tripod", "slow push-in towards subject", "smooth dolly tracking left-to-right", "orbiting 360° around subject", "crane rising up", "handheld with subtle shake" +D) FRAMING: "rule of thirds with subject on left intersect", "perfectly centered symmetrical", "framed through doorway", "leading lines converging to vanishing point", "negative space in upper third for text overlay" + +❌ BAD: "wide shot of the city" +✅ GOOD: "Extreme wide establishing shot from a drone at 300 meters altitude, camera slowly descending at 45-degree angle, the ancient temple complex positioned on the lower-right third of frame, leading lines of the river drawing the eye from lower-left foreground to the temple, vast jungle canopy filling the upper two-thirds creating a sense of overwhelming scale, a thin mist layer at the treeline adding depth separation between foreground and background" + +ASPECT RATIO COMPOSITION GUIDE: +• 9:16 (PORTRAIT — Shorts/Reels): Vertical framing, subject fills center-frame, use foreground-to-background depth, create visual interest through vertical stacking of elements, leave negative space in top or bottom third for text/subtitles +• 16:9 (LANDSCAPE — YouTube): Classic cinematic horizontal composition, use wide establishing shots, rule of thirds, leading lines across the horizontal plane, anamorphic letterbox feel +• 1:1 (SQUARE — Instagram): Centered symmetrical composition, tight and focused framing, every corner of frame contributes, no wasted space, bold and graphic + +━━━ LAYER 5: FINISHING DETAILS (Texture, Film, Post-Processing) ━━━ +This is what separates amateur prompts from professional ones. These details define the visual identity. + +A) DEPTH OF FIELD: "razor-thin f/1.4 bokeh with only eyes in focus", "deep focus f/11 everything sharp", "medium depth f/4 with soft background", "tilt-shift miniature effect" +B) FILM/SENSOR: "shot on 35mm Kodak Portra 400 film with visible grain", "65mm IMAX large format ultra-sharp", "8mm Super 8 home movie with heavy grain and light leaks", "medium format Hasselblad 6x6", "anamorphic Panavision with oval bokeh and horizontal lens flare" +C) COLOR GRADING: "desaturated teal-and-orange blockbuster grade", "warm nostalgic sepia undertones", "high-contrast crushed blacks", "pastel low-saturation soft", "vivid hyper-saturated pop art", "monochrome with single color accent" +D) TEXTURE & ARTIFACTS: "subtle film grain ISO 800", "clean digital noise-free", "chromatic aberration at frame edges", "lens flare from bright source", "dust motes floating in light beams", "rain droplets on lens surface", "vintage halation around highlights" +E) POST-PROCESSING: "split-toning warm highlights cool shadows", "slight vignette darkening corners", "bloom on bright areas", "mist/haze diffusion" + +❌ BAD: "nice looking image" +✅ GOOD: "Shot on vintage Cooke anamorphic lens with characteristic oval bokeh and warm amber flare, shallow depth of field f/2.0 isolating the subject from a dreamy out-of-focus background, subtle Kodak Vision3 500T tungsten film grain, color graded with lifted blacks and desaturated midtones creating a faded cinematic look, gentle halation glow around practical light sources, slight vignette pulling focus to center frame" + +━━━ NEGATIVE PROMPT (What to AVOID) ━━━ +Every visualPrompt MUST end with a brief negative constraint line starting with "Avoid:" to prevent common AI generation artifacts: +"Avoid: text overlays, watermarks, brand logos, recognizable celebrity faces, distorted anatomy, extra fingers, blurry faces, stock photo aesthetic, oversaturated CGI plastic look, generic clip art style, UI elements" + +Adjust the negative prompt per scene as needed, but ALWAYS include it. + +━━━ VISUAL CONTINUITY ACROSS ALL SCENES ━━━ +This is CRITICAL. All scenes in one project must feel like they belong to the same film/visual world: +• Scene 1 establishes the COLOR PALETTE — all subsequent scenes use the same palette +• Scene 1 establishes the FILM STOCK/TEXTURE — all subsequent scenes match +• Scene 1 establishes the LIGHTING STYLE — all subsequent scenes maintain similar lighting quality +• Scene 1 establishes the CAMERA LANGUAGE — all subsequent scenes follow similar framing rules +• Transitioning between moods within a video is allowed, but must be GRADUAL (e.g. warm→cool over 3 scenes, not a sudden jump) +• Include a "Visual Continuity Anchor" at the start of each prompt after Scene 1: "Continuing the [established reference] visual language from previous scenes:" + +━━━ MINIMUM PROMPT LENGTH ━━━ +• Hook scene (Scene 1): Minimum 80 words — this establishes the entire visual world +• Middle scenes: Minimum 50 words each +• Closing scene: Minimum 50 words — emotional visual peak +• If any visualPrompt is under these minimums, you are not being specific enough. Add more Layer 1 (subject) and Layer 5 (finishing) details. + +━━━ VIDEO STYLE → VISUAL DNA MAP ━━━ +Match the "videoStyle" to its corresponding visual DNA. These are your default creative parameters per style: + +CINEMATIC: + Reference: Denis Villeneuve, Roger Deakins cinematography, Christopher Nolan IMAX + Lighting: Dramatic key-and-fill, single strong motivated source, deep shadows + Lens: 35mm anamorphic or 65mm IMAX, shallow DOF + Color: Teal-orange grade, desaturated midtones, crushed blacks + Texture: Film grain, anamorphic lens flare, subtle vignette + +DOCUMENTARY: + Reference: National Geographic, Planet Earth II, David Attenborough + Lighting: Natural available light, no artificial sources, authentic + Lens: 50mm prime or telephoto for wildlife, deep focus + Color: Natural warm tones, true-to-life, slight warm saturation boost + Texture: Clean digital but not sterile, slight handheld vibration feel + +EDUCATIONAL: + Reference: Kurzgesagt, 3Blue1Brown, Vox explainers + Lighting: Flat even illumination, clean and clear + Lens: Overhead/diagram view or isometric angles + Color: Bold saturated primary colors on dark or white backgrounds + Texture: Vector-clean sharp edges, infographic precision, flat design + +STORYTELLING: + Reference: Wes Anderson, Studio Ghibli, illustrated storybooks + Lighting: Warm golden soft diffused light, fairy-tale quality + Lens: Medium lens, symmetrical centered framing + Color: Pastel palette, vintage warmth, muted yet colorful + Texture: Painterly soft texture, watercolor wash, gentle + +NEWS: + Reference: BBC World, CNN, Al Jazeera graphics packages + Lighting: High-key even broadcast studio or natural location light + Lens: Standard 50mm, eye-level, clean composition + Color: Neutral cool, high contrast, professional + Texture: Clean sharp digital, motion graphics overlays + +ARTISTIC: + Reference: Tarkovsky, Wong Kar-wai, Terrence Malick + Lighting: Extreme chiaroscuro, unconventional color temperatures + Lens: Wide angle with distortion or extreme close macro + Color: Surreal color shifts, split-toning, bold unconventional palettes + Texture: Heavy grain, intentional imperfections, analog artifacts + +ANIME: + Reference: Makoto Shinkai (Your Name, Weathering With You), Studio Ghibli, Ufotable + Lighting: Ethereal glowing light rays, dramatic cel-shaded lighting, light bloom + Lens: Dynamic manga-inspired angles, dramatic low/high angles, speed lines in action + Color: Vivid saturated anime palette, glowing skies, luminous highlights + Texture: Clean cel-shaded lines, painted backgrounds with photorealistic detail, sparkle particles + +ANIMATION_3D: + Reference: Pixar (Soul, WALL-E), DreamWorks, Unreal Engine 5 cinematics + Lighting: Global illumination, subsurface scattering on skin, volumetric god rays + Lens: Virtual cinema camera with realistic DOF, Pixar-style dramatic angles + Color: Rich saturated yet natural, UE5 photorealistic rendering palette + Texture: Smooth subdivision surfaces, micro-detail on materials, photorealistic shaders + +ANIMATION_2D: + Reference: Classic Disney (hand-drawn era), Cartoon Saloon (Wolfwalkers), French animation + Lighting: Painted light and shadow, flat but expressive + Lens: Flat 2D composition, layered parallax depth, theatrical staging + Color: Gouache/watercolor palette, limited but expressive color choices + Texture: Visible brushstrokes, hand-drawn line quality, paper texture subtlety + +STOP_MOTION: + Reference: Laika Studios (Coraline, Kubo), Wes Anderson (Fantastic Mr. Fox), Aardman + Lighting: Miniature set practical lighting, visible light rigs at small scale, warm + Lens: Macro lens shallow DOF revealing miniature scale, tilt-shift + Color: Handcrafted tactile palette, slightly desaturated warm tones + Texture: Visible material textures (clay, felt, wood, fabric), fingerprints on clay, puppet joints + +INFOGRAPHIC: + Reference: Kurzgesagt, Visual Capitalist, Hans Rosling data visualization + Lighting: Flat, no directional light, pure graphic illumination + Lens: Orthographic/isometric projection, no perspective distortion + Color: Data-driven palette — 3-5 semantic colors, dark background with bright accents + Texture: Ultra-clean vector, sharp geometric edges, flat design with subtle shadows + +RETRO_80S: + Reference: Synthwave/Outrun aesthetic, Stranger Things, Drive (2011) + Lighting: Neon purple/pink/cyan glow, laser grid lines, chrome reflections + Lens: Wide angle capturing expansive neon landscapes, low angle + Color: Neon magenta, electric cyan, deep purple, chrome silver, hot pink sunset gradients + Texture: CRT scanlines, VHS tracking artifacts, retro pixel grid, chrome reflections + +MINIMALIST: + Reference: Apple design language, Dieter Rams, Japanese zen aesthetics + Lighting: Clean soft diffused studio light, seamless white/gray background + Lens: Product photography precision, clean medium shot + Color: Monochrome with single accent color, vast negative space + Texture: Ultra-smooth surfaces, no grain, no artifacts, pristine + +SURREAL: + Reference: Salvador Dalí, René Magritte, M.C. Escher, Alex Grey + Lighting: Impossible light sources, multiple conflicting shadows, dreamy glow + Lens: Fish-eye distortion, impossible geometry, recursive perspectives + Color: Hyper-vivid otherworldly palette, colors that don't exist in nature + Texture: Ultra-detailed photo-real rendering of impossible objects, smooth dreamlike surfaces ═══════════════════════════════════ NARRATION TEXT (IN TARGET LANGUAGE) @@ -337,14 +595,16 @@ export class VideoAiService { const script = this.parseAndValidateScript(rawText); const humanizedScript = this.applyHumanizerPass(script); + const enrichedScript = this.enrichVisualPrompts(humanizedScript, input.videoStyle, input.aspectRatio); this.logger.log( - `✅ Senaryo üretildi — "${humanizedScript.metadata.title}", ` + - `${humanizedScript.scenes.length} sahne, ${humanizedScript.metadata.totalDurationSeconds}s, ` + - `SEO keywords: ${humanizedScript.seo?.keywords?.length || 0}`, + `✅ Senaryo üretildi — "${enrichedScript.metadata.title}", ` + + `${enrichedScript.scenes.length} sahne, ${enrichedScript.metadata.totalDurationSeconds}s, ` + + `SEO keywords: ${enrichedScript.seo?.keywords?.length || 0}, ` + + `Avg visual prompt words: ${Math.round(enrichedScript.scenes.reduce((sum, s) => sum + s.visualPrompt.split(' ').length, 0) / enrichedScript.scenes.length)}`, ); - return humanizedScript; + return enrichedScript; } catch (error) { if (error instanceof InternalServerErrorException) throw error; this.logger.error( @@ -366,19 +626,36 @@ export class VideoAiService { const languageName = langMap[input.language] || input.language; + // Aspect ratio → kompozisyon yönlendirmesi + const aspectRatioGuide = this.getAspectRatioGuide(input.aspectRatio); + let prompt = `Create a YouTube Shorts video script about: "${input.topic}"\n\n` + `Requirements:\n` + `- Target duration: ${input.targetDurationSeconds} seconds\n` + `- Narration and subtitle language: ${languageName} (${input.language})\n` + - `- Visual prompts: ALWAYS in English (for Higgsfield AI)\n` + - `- Video style: ${input.videoStyle}\n` + + `- Visual prompts: ALWAYS in English (for AI image/video generation)\n` + + `- Video style: ${input.videoStyle} — STRICTLY follow the Visual DNA Map for this style\n` + + `- Aspect ratio: ${input.aspectRatio || 'PORTRAIT_9_16'} — ${aspectRatioGuide}\n` + `- Make it viral-worthy, visually stunning, and intellectually captivating\n` + `- The first 2 seconds must hook the viewer immediately\n` + `- Write narration that sounds HUMAN — avoid AI writing patterns\n` + `- Include SEO-optimized metadata with keywords and schema markup\n` + `- Generate social media captions for YouTube, TikTok, Instagram, Twitter\n`; + // 5-Layer Architecture hatırlatması + prompt += `\n═══ VISUAL PROMPT REQUIREMENTS (CRITICAL) ═══\n`; + prompt += `Each visualPrompt MUST contain ALL 5 layers:\n`; + prompt += `1. SUBJECT: Extreme specificity — materials, textures, spatial relationships, lived-in details\n`; + prompt += `2. MOOD/REFERENCE: Film/art/photography references that define the visual universe\n`; + prompt += `3. LIGHTING: Source + Direction + Quality (e.g. "golden hour from camera-right at 15°, warm amber 3200K")\n`; + prompt += `4. COMPOSITION: Camera position + distance + movement + framing rules\n`; + prompt += `5. FINISHING: DOF, film stock, color grade, texture, post-processing\n`; + prompt += `Each visualPrompt MUST end with "Avoid: [list of things to avoid]"\n`; + prompt += `Scene 1 establishes the visual world — all subsequent scenes maintain continuity.\n`; + prompt += `Scene 1 minimum: 80 words | Other scenes minimum: 50 words\n`; + prompt += `═══════════════════════════════════════════\n`; + if (input.seoKeywords?.length) { prompt += `\nTarget SEO keywords to incorporate naturally: ${input.seoKeywords.join(', ')}\n`; } @@ -419,6 +696,21 @@ export class VideoAiService { return prompt; } + /** + * Aspect ratio'ya göre kompozisyon rehberi döndürür. + */ + private getAspectRatioGuide(aspectRatio?: string): string { + switch (aspectRatio) { + case 'LANDSCAPE_16_9': + return 'Classic cinematic horizontal composition, use wide establishing shots, rule of thirds, leading lines across horizontal plane, anamorphic letterbox feel'; + case 'SQUARE_1_1': + return 'Centered symmetrical composition, tight focused framing, every corner contributes, no wasted space, bold and graphic'; + case 'PORTRAIT_9_16': + default: + return 'Vertical framing optimized for mobile, subject fills center-frame, use foreground-to-background depth, vertical stacking of elements, negative space in top/bottom third for text'; + } + } + /** * Post-processing: Humanizer skill uygulaması * AI yazım kalıplarını tespit edip düzeltir @@ -488,6 +780,447 @@ export class VideoAiService { return script; } + /** + * Post-processing: Visual Prompt Enrichment + * 5-Katmanlı Architecture™ kalite kontrolü ve otomatik tamamlama. + * - Minimum kelime sayısı kontrolü + * - Eksik katmanları stil DNA'sına göre tamamlar + * - Negative prompt enjeksiyonu + * - Visual continuity anchor ekleme + */ + private enrichVisualPrompts( + script: GeneratedScript, + videoStyle: string, + aspectRatio?: string, + ): GeneratedScript { + const styleDNA = this.getStyleDNA(videoStyle); + const defaultNegative = 'Avoid: text overlays, watermarks, brand logos, recognizable celebrity faces, distorted anatomy, extra fingers, blurry faces, stock photo aesthetic, oversaturated CGI plastic look, generic clip art, UI elements'; + + for (let i = 0; i < script.scenes.length; i++) { + const scene = script.scenes[i]; + let vp = scene.visualPrompt; + const wordCount = vp.split(/\s+/).length; + const isHook = i === 0; + const minWords = isHook ? 80 : 50; + + // 1. Minimum kelime kontrolü — eksikse stil DNA'sından zenginleştir + if (wordCount < minWords) { + this.logger.debug( + `VisualEnrich: Sahne ${scene.order} — ${wordCount} kelime (min: ${minWords}), zenginleştiriliyor`, + ); + vp = this.padVisualPrompt(vp, styleDNA, minWords, isHook); + } + + // 2. Visual continuity anchor — Scene 2+ için + if (i > 0 && !vp.toLowerCase().includes('continuing')) { + vp = `Continuing the ${styleDNA.reference} visual language established in previous scenes: ${vp}`; + } + + // 3. Aspect ratio compositional hint — eksikse ekle + if (aspectRatio && !vp.toLowerCase().includes('framing') && !vp.toLowerCase().includes('composition')) { + const arHint = aspectRatio === 'PORTRAIT_9_16' + ? 'Vertical framing optimized for mobile viewing.' + : aspectRatio === 'LANDSCAPE_16_9' + ? 'Wide cinematic horizontal composition.' + : 'Square centered symmetrical framing.'; + vp = `${vp} ${arHint}`; + } + + // 4. Negative prompt — eksikse ekle + if (!vp.toLowerCase().includes('avoid:')) { + vp = `${vp} ${defaultNegative}`; + } + + scene.visualPrompt = vp; + } + + return script; + } + + /** + * Kısa visual prompt'u stil DNA bilgileriyle zenginleştirir. + */ + private padVisualPrompt( + prompt: string, + styleDNA: StyleDNA, + targetWords: number, + isHook: boolean, + ): string { + const currentWords = prompt.split(/\s+/).length; + const additions: string[] = []; + + // Lighting eksikse ekle + if (!prompt.toLowerCase().includes('light') && !prompt.toLowerCase().includes('shadow')) { + additions.push(styleDNA.lighting); + } + + // Lens/DOF eksikse ekle + if (!prompt.toLowerCase().includes('lens') && !prompt.toLowerCase().includes('depth of field') && !prompt.toLowerCase().includes('dof') && !prompt.toLowerCase().includes('f/')) { + additions.push(styleDNA.lens); + } + + // Color grade eksikse ekle + if (!prompt.toLowerCase().includes('color') && !prompt.toLowerCase().includes('grade') && !prompt.toLowerCase().includes('palette')) { + additions.push(styleDNA.color); + } + + // Texture eksikse ekle + if (!prompt.toLowerCase().includes('grain') && !prompt.toLowerCase().includes('texture') && !prompt.toLowerCase().includes('film')) { + additions.push(styleDNA.texture); + } + + // Referans eksikse ekle + if (!prompt.toLowerCase().includes('style') && !prompt.toLowerCase().includes('inspired') && !prompt.toLowerCase().includes('aesthetic')) { + additions.push(`Visual style inspired by ${styleDNA.reference}.`); + } + + // Hook sahne için ekstra detay + if (isHook && currentWords + additions.join(' ').split(/\s+/).length < targetWords) { + additions.push('This is the opening shot — it must immediately capture attention and establish the visual world of the entire video.'); + } + + return `${prompt} ${additions.join(' ')}`; + } + + /** + * Video stiline göre varsayılan görsel DNA değerlerini döndürür. + */ + private getStyleDNA(videoStyle: string): StyleDNA { + const dnaMap: Record = { + CINEMATIC: { + reference: 'Denis Villeneuve and Roger Deakins cinematography', + lighting: 'Dramatic key-and-fill lighting with a single strong motivated source casting deep sculpted shadows.', + lens: 'Shot on 35mm anamorphic lens with shallow depth of field f/2.0 and characteristic oval bokeh.', + color: 'Teal-and-orange blockbuster color grade with desaturated midtones and crushed blacks.', + texture: 'Subtle Kodak Vision3 film grain, anamorphic horizontal lens flare, slight vignette darkening corners.', + }, + DOCUMENTARY: { + reference: 'National Geographic and Planet Earth II', + lighting: 'Natural available daylight, no artificial sources, authentic and observational.', + lens: 'Shot on 50mm prime lens with deep focus f/8, everything sharp and clear.', + color: 'Natural warm tones, true-to-life rendering with slight warm saturation boost.', + texture: 'Clean digital capture with slight handheld vibration feel, no post-processing artifacts.', + }, + EDUCATIONAL: { + reference: 'Kurzgesagt and 3Blue1Brown explainer videos', + lighting: 'Flat even illumination, clean and clear, no directional shadows.', + lens: 'Overhead diagram view or isometric angles, deep focus everything sharp.', + color: 'Bold saturated primary colors on dark background, data-visualization palette.', + texture: 'Vector-clean sharp edges, infographic precision, flat design with subtle drop shadows.', + }, + STORYTELLING: { + reference: 'Wes Anderson symmetry and Studio Ghibli warmth', + lighting: 'Warm golden soft diffused light with fairy-tale quality, gentle and inviting.', + lens: 'Medium lens with symmetrical centered framing, storybook composition.', + color: 'Pastel palette with vintage warmth, muted yet colorful, nostalgic.', + texture: 'Painterly soft texture with watercolor wash quality, gentle and dreamy.', + }, + NEWS: { + reference: 'BBC World and CNN broadcast graphics', + lighting: 'High-key even broadcast studio lighting or natural location light.', + lens: 'Standard 50mm at eye-level, clean professional composition.', + color: 'Neutral cool tones, high contrast, professional and authoritative.', + texture: 'Clean sharp digital, motion graphics readiness, no grain.', + }, + ARTISTIC: { + reference: 'Tarkovsky, Wong Kar-wai, and Terrence Malick', + lighting: 'Extreme chiaroscuro with unconventional color temperatures, moody and atmospheric.', + lens: 'Wide angle with slight distortion or extreme close macro, creative framing.', + color: 'Surreal color shifts with split-toning, bold unconventional palettes.', + texture: 'Heavy analog film grain, intentional imperfections, light leaks, vintage artifacts.', + }, + ANIME: { + reference: 'Makoto Shinkai (Your Name, Weathering With You) and Studio Ghibli', + lighting: 'Ethereal glowing light rays with dramatic cel-shaded lighting, luminous bloom effects.', + lens: 'Dynamic manga-inspired angles with dramatic low and high perspectives, speed lines for action.', + color: 'Vivid saturated anime palette with glowing skies and luminous highlights.', + texture: 'Clean cel-shaded lines with painted backgrounds, photorealistic environmental detail, sparkle particles.', + }, + ANIMATION_3D: { + reference: 'Pixar (Soul, WALL-E) and Unreal Engine 5 cinematics', + lighting: 'Global illumination with subsurface scattering on skin, volumetric god rays through atmosphere.', + lens: 'Virtual cinema camera with realistic depth of field, Pixar-style dramatic angles.', + color: 'Rich saturated yet natural rendering palette, photorealistic material shaders.', + texture: 'Smooth subdivision surfaces with micro-detail on materials, photorealistic shader quality.', + }, + ANIMATION_2D: { + reference: 'Classic Disney hand-drawn era and Cartoon Saloon (Wolfwalkers)', + lighting: 'Painted light and shadow, flat but highly expressive, artistic lighting.', + lens: 'Flat 2D composition with layered parallax depth, theatrical staging.', + color: 'Gouache and watercolor palette, limited but expressive color choices.', + texture: 'Visible brushstrokes, hand-drawn line quality, subtle paper texture.', + }, + STOP_MOTION: { + reference: 'Laika Studios (Coraline, Kubo) and Wes Anderson (Fantastic Mr. Fox)', + lighting: 'Miniature set practical lighting with visible small-scale light rigs, warm intimate.', + lens: 'Macro lens with shallow DOF revealing miniature scale, tilt-shift effect.', + color: 'Handcrafted tactile palette, slightly desaturated warm tones.', + texture: 'Visible material textures — clay, felt, wood, fabric, fingerprints on clay, puppet joints visible.', + }, + INFOGRAPHIC: { + reference: 'Kurzgesagt, Visual Capitalist, and Hans Rosling data visualization', + lighting: 'Flat pure graphic illumination, no directional light, even.', + lens: 'Orthographic or isometric projection, no perspective distortion.', + color: 'Data-driven palette with 3-5 semantic colors, dark background with bright accent colors.', + texture: 'Ultra-clean vector graphics, sharp geometric edges, flat design with subtle shadows.', + }, + RETRO_80S: { + reference: 'Synthwave/Outrun aesthetic, Stranger Things, and Drive (2011)', + lighting: 'Neon purple, pink, and cyan glow with laser grid lines and chrome reflections.', + lens: 'Wide angle capturing expansive neon landscapes from low angle.', + color: 'Neon magenta, electric cyan, deep purple, chrome silver, hot pink sunset gradients.', + texture: 'CRT scanlines, VHS tracking artifacts, retro pixel grid, reflective chrome surfaces.', + }, + MINIMALIST: { + reference: 'Apple product design language and Japanese zen aesthetics', + lighting: 'Clean soft diffused studio light, seamless white or gray gradient background.', + lens: 'Product photography precision, clean medium shot with perfect focus.', + color: 'Monochrome palette with single accent color, vast negative space.', + texture: 'Ultra-smooth surfaces, absolutely no grain or artifacts, pristine and clinical.', + }, + SURREAL: { + reference: 'Salvador Dalí, René Magritte, and M.C. Escher', + lighting: 'Impossible multiple light sources, conflicting shadow directions, dreamy supernatural glow.', + lens: 'Fish-eye distortion, impossible recursive geometry, Droste effect perspectives.', + color: 'Hyper-vivid otherworldly palette, colors that defy natural physics.', + texture: 'Ultra-detailed photorealistic rendering of impossible and paradoxical objects, smooth dreamlike surfaces.', + }, + // === Ek Film & Sinema === + NOIR: { + reference: 'Classic Film Noir — Double Indemnity, The Third Man, Sin City', + lighting: 'High-contrast chiaroscuro with venetian blind shadow patterns, single hard spotlight from above-left, deep impenetrable blacks.', + lens: 'Wide angle 28mm with Dutch angle tilts, deep focus noir staging, low camera angles.', + color: 'Stark black-and-white or heavily desaturated with single color accent (red lips, neon sign), crushed blacks.', + texture: 'Heavy film grain ISO 1600, scratched celluloid, cigarette smoke diffusion, rain-streaked windows.', + }, + VLOG: { + reference: 'Casey Neistat, MrBeast, authentic YouTube creator aesthetic', + lighting: 'Natural mixed lighting — ring light on face, window daylight, practical room lights visible.', + lens: 'Wide angle 16mm GoPro or 24mm vlog lens, slight barrel distortion, close to subject.', + color: 'Punchy saturated colors, slightly lifted shadows, bright and energetic YouTube grade.', + texture: 'Clean digital with slight motion blur from handheld movement, casual and authentic feel.', + }, + // === Ek Animasyon === + MOTION_COMIC: { + reference: 'Marvel Motion Comics, Watchmen Motion Comic, DC animated panels', + lighting: 'Dramatic comic book lighting with bold cast shadows, high-contrast key light.', + lens: 'Panel-framed compositions with zoom-and-pan (Ken Burns effect on comic panels), dramatic angles.', + color: 'Rich saturated comic book palette with bold primaries, inked outlines, Ben-Day dots.', + texture: 'Printed comic texture with halftone dots, speech bubble spaces, panel border lines, ink splatter.', + }, + CARTOON: { + reference: 'Looney Tunes, The Simpsons, Adventure Time, modern Cartoon Network', + lighting: 'Flat cartoon lighting with simple cast shadows, bright and even, no complex lighting.', + lens: 'Exaggerated cartoon perspectives, squash and stretch compositions, dynamic action poses.', + color: 'Bold flat colors with thick outlines, limited palette per scene, saturated and cheerful.', + texture: 'Clean vector lines, smooth flat fills, no grain or noise, crisp digital cartoon rendering.', + }, + CLAYMATION: { + reference: 'Aardman Animations (Wallace & Gromit), Celebrity Deathmatch, Robot Chicken', + lighting: 'Warm miniature set practical lighting with soft shadows, slightly uneven handmade quality.', + lens: 'Macro lens at miniature scale, moderate depth of field, slightly wobbly stop-motion framing.', + color: 'Earthy clay-like palette, warm skin tones on plasticine, handcrafted color mixing.', + texture: 'Visible clay fingerprints, plasticine surface texture, wire armature hints, handmade imperfections.', + }, + PIXEL_ART: { + reference: '8-bit/16-bit retro gaming — Final Fantasy VI, Chrono Trigger, Celeste, Stardew Valley', + lighting: 'Pixel-based dithered lighting, limited shading levels (3-4 tones per color), NES/SNES era.', + lens: 'Flat orthographic top-down or side-scrolling view, tile-based grid composition.', + color: 'Limited retro palette (16-64 colors), vibrant pixel colors, classic hardware palette constraints.', + texture: 'Visible individual pixels, no anti-aliasing, crisp hard pixel edges, scanline optional.', + }, + ISOMETRIC: { + reference: 'Monument Valley, SimCity, isometric architectural illustration, Diablo II', + lighting: 'Even isometric lighting from upper-left at 45 degrees, clean predictable shadows.', + lens: 'True isometric projection (30-degree angle), no perspective vanishing points, tiled grid.', + color: 'Clean architectural palette, organized by function/zone, pastel or bold depending on theme.', + texture: 'Clean geometric surfaces, subtle material differentiation, architectural precision.', + }, + // === Ek Eğitim & Bilgi === + WHITEBOARD: { + reference: 'RSA Animate, Khan Academy, TED-Ed whiteboard explainers', + lighting: 'Bright even overhead lighting on white surface, no shadows, pure clarity.', + lens: 'Top-down or slight angle on whiteboard surface, steady and centered.', + color: 'Black ink on white background, limited accent colors (red, blue, green markers).', + texture: 'Whiteboard surface with slight marker texture, hand-drawn line quality, dry-erase aesthetic.', + }, + EXPLAINER: { + reference: 'Slack, Dropbox, and Stripe product explainer videos, Lottie animations', + lighting: 'Flat design lighting, no directional shadows, clean and corporate.', + lens: 'Centered framing with smooth transitions, screen-recording-like precision.', + color: 'Brand-consistent palette with 2-3 primary colors, white or light gray background.', + texture: 'Smooth vector animation, Lottie-style motion, rounded corners, friendly and approachable.', + }, + DATA_VIZ: { + reference: 'New York Times data journalism, Flourish, D3.js visualizations, Reuters Graphics', + lighting: 'Flat graphic illumination, data-first clarity, no atmospheric effects.', + lens: 'Orthographic or minimal perspective, focus on data readability and visual hierarchy.', + color: 'Sequential and diverging color scales (viridis, plasma), accessible color-blind-safe palettes.', + texture: 'Ultra-clean SVG precision, smooth gradients in charts, minimal grid lines, data-ink ratio optimized.', + }, + // === Ek Retro & Nostaljik === + VINTAGE_FILM: { + reference: 'Super 8 home movies, 1960s-70s amateur filmmaking, Kodachrome slides', + lighting: 'Overexposed daylight with lens flare, warm sunlight washing out highlights.', + lens: 'Vintage Super 8 lens with soft focus and vignette, slight zoom wobble.', + color: 'Faded Kodachrome warm tones, yellowed highlights, shifted reds toward orange.', + texture: 'Heavy film grain, light leaks, sprocket hole marks, dust and scratches, frame jitter.', + }, + VHS: { + reference: '1980s-90s VHS home recordings, retro TV aesthetic, analog glitch art', + lighting: 'CRT television glow, slightly blown-out highlights, low dynamic range.', + lens: 'Consumer camcorder wide angle, auto-focus hunting, slight barrel distortion.', + color: 'Washed-out blues and reds, bleeding color channels, oversaturated skin tones.', + texture: 'VHS tracking lines, horizontal noise bands, tape dropout artifacts, CRT scanlines, timecode overlay.', + }, + POLAROID: { + reference: 'Instant film photography — Polaroid SX-70, Fujifilm Instax, analog snap aesthetic', + lighting: 'Flash-heavy with harsh direct flash shadows, or warm window light for lifestyle shots.', + lens: 'Fixed focal length instant camera lens, moderate depth of field, square or 3:4 crop.', + color: 'Characteristic Polaroid color shift — green shadows, warm creamy highlights, soft pastels.', + texture: 'Instant film border frame, slightly soft focus, chemical development artifacts, white border.', + }, + RETRO_90S: { + reference: 'Y2K aesthetic, early internet, Windows 95, rave culture, Saved by the Bell', + lighting: 'Colorful gelled lights, UV blacklight, early digital camera flash.', + lens: 'Point-and-shoot digital camera look, red-eye flash, auto-everything.', + color: 'Y2K palette — iridescent, holographic, lime green, hot pink, electric blue, chrome.', + texture: 'Early JPEG compression artifacts, low-res pixelation, dial-up era digital, bubble fonts.', + }, + // === Ek Sanat Akımları === + WATERCOLOR: { + reference: 'Traditional watercolor illustration, botanical art, childrens book illustration', + lighting: 'Soft diffused natural light suggesting form through color temperature shifts.', + lens: 'Flat illustration composition, no perspective distortion, art print framing.', + color: 'Transparent layered washes, wet-on-wet bleeding edges, limited palette with visible mixing.', + texture: 'Visible watercolor paper grain (cold-pressed), pigment granulation, paint blooms, white paper showing through.', + }, + OIL_PAINTING: { + reference: 'Classical oil painting — Rembrandt, Vermeer, John Singer Sargent, plein-air impressionism', + lighting: 'Rembrandt triangle lighting, warm candle-like illumination, dramatic tonal contrast.', + lens: 'Classical portrait or landscape composition, Renaissance perspective, golden ratio.', + color: 'Rich oil pigment colors — cadmium yellow, burnt sienna, ultramarine blue, titanium white.', + texture: 'Visible impasto brushstrokes, canvas weave texture, palette knife marks, layered glazes.', + }, + IMPRESSIONIST: { + reference: 'Claude Monet, Pierre-Auguste Renoir, Edgar Degas, late 19th-century plein-air painting', + lighting: 'Atmospheric outdoor light capturing specific time of day, light as the subject itself.', + lens: 'Plein-air landscape or intimate scene framing, slightly cropped like a snapshot.', + color: 'Broken color technique — short dabs of pure pigment that blend optically, complementary vibrations.', + texture: 'Dense visible brushstrokes, comma and dash marks, scumbled passages, canvas texture beneath paint.', + }, + POP_ART: { + reference: 'Andy Warhol, Roy Lichtenstein, Keith Haring, Takashi Murakami', + lighting: 'Flat even lighting, no shadows, silk-screen reproduction aesthetic.', + lens: 'Flat graphic composition, repeated grid patterns, bold iconic framing.', + color: 'CMYK primary colors — bold red, yellow, blue, black outlines, flat color fills.', + texture: 'Ben-Day dots, silk-screen print registration, halftone patterns, bold black outlines.', + }, + UKIYO_E: { + reference: 'Hokusai (The Great Wave), Hiroshige, traditional Japanese woodblock prints', + lighting: 'Flat decorative lighting with no cast shadows, atmospheric perspective through color.', + lens: 'Flat 2D composition with layered depth planes, floating world perspective.', + color: 'Traditional Japanese pigments — indigo, vermillion, saffron, black sumi ink, muted earth tones.', + texture: 'Woodblock print grain, visible wood grain texture in flat areas, hand-carved line quality.', + }, + ART_DECO: { + reference: '1920s-30s Art Deco — Chrysler Building, Tamara de Lempicka, The Great Gatsby', + lighting: 'Glamorous theatrical lighting with gold reflections, spotlight elegance.', + lens: 'Symmetrical architectural framing, towering vertical compositions, geometric precision.', + color: 'Gold, black, silver, deep emerald, sapphire blue, ivory — luxurious metallic palette.', + texture: 'Geometric patterns, sunburst rays, chevrons, stepped forms, chrome and glass surfaces.', + }, + COMIC_BOOK: { + reference: 'Marvel Comics (Jack Kirby), DC Comics, Manga (Akira, Dragon Ball)', + lighting: 'Dynamic action lighting with speed lines, explosive rim lights, dramatic chiaroscuro.', + lens: 'Extreme foreshortening, dynamic action angles, upshot hero poses, panel-based framing.', + color: 'Bold four-color printing palette, flat fills with gradient shading, spot blacks.', + texture: 'Ink line art with cross-hatching, Zip-A-Tone dot patterns, action lines, impact effects.', + }, + SKETCH: { + reference: 'Pencil sketching, charcoal drawing, architectural rendering, fashion illustration', + lighting: 'Implied through hatching density and paper-white highlights, no color-based lighting.', + lens: 'Sketchbook page composition, slightly off-center, intimate and personal framing.', + color: 'Monochrome graphite gray scale, or limited sepia/sanguine warm tones, white paper dominant.', + texture: 'Visible pencil strokes, cross-hatching, smudged graphite, eraser marks, paper tooth texture.', + }, + // === Ek Modern & Minimal === + GLASSMORPHISM: { + reference: 'Apple iOS frosted glass, modern UI design, translucent material design', + lighting: 'Soft diffused backlight through frosted glass, colorful blurred background gradients.', + lens: 'Clean UI-like framing, centered elements, clear visual hierarchy.', + color: 'Frosted semi-transparent whites and pastels over vibrant gradient backgrounds.', + texture: 'Frosted glass blur, subtle border glow, drop shadows, backdrop-filter blur effect.', + }, + NEON: { + reference: 'Tokyo Shinjuku at night, Las Vegas strip, neon sign art, luminous night photography', + lighting: 'Multiple neon tube light sources casting colored glows, reflections on wet surfaces and glass.', + lens: 'Night photography with wide aperture f/1.4, bokeh circles from background neon, slight motion blur.', + color: 'Electric neon palette — hot pink, electric blue, vivid green, purple, against deep black.', + texture: 'Wet street reflections, glass and chrome reflections, light bloom around neon tubes, night grain.', + }, + CYBERPUNK: { + reference: 'Cyberpunk 2077, Ghost in the Shell, Akira, Blade Runner, William Gibson', + lighting: 'Neon-lit rain-soaked scenes, holographic projections, LED screens casting colored light.', + lens: 'Wide angle capturing dense urban environments, low angle looking up at megastructures.', + color: 'Toxic neon green, deep magenta, cyan HUD blue, Chrome silver, against polluted dark skies.', + texture: 'Rain droplets on lens, holographic glitch artifacts, digital noise, chrome and wet surfaces.', + }, + STEAMPUNK: { + reference: 'Victorian-era mechanical fantasy, Jules Verne, H.G. Wells, Bioshock Infinite', + lighting: 'Warm gas lamp and candle light, brass reflections, furnace glow, London fog diffusion.', + lens: 'Period-appropriate framing with brass vignette edges, medium shots of intricate machinery.', + color: 'Brass, copper, aged leather brown, dark mahogany, forest green, ivory, sepia warmth.', + texture: 'Victorian ornate metalwork, riveted brass plates, leather straps, exposed gears, steam clouds.', + }, + ABSTRACT: { + reference: 'Kandinsky, Mondrian, Jackson Pollock, Rothko, generative art, Processing/p5.js', + lighting: 'Non-representational — light as pure color fields, no physical light source.', + lens: 'No traditional perspective, flat or infinite depth, purely compositional framing.', + color: 'Pure color theory exploration — complementary, analogous, triadic harmonies, bold saturation.', + texture: 'Paint splatter, geometric precision, generative algorithmic patterns, or pure smooth gradients.', + }, + // === Fotoğrafik === + PRODUCT: { + reference: 'Apple product photography, premium e-commerce, studio packshot lighting', + lighting: 'Multi-light studio setup — key light from 45°, fill from opposite, rim light for edge separation, white seamless background.', + lens: 'Macro to medium shot, 100mm macro lens, f/8 deep focus on product, clean background.', + color: 'Neutral white or gradient background, products true colors faithfully rendered, no color cast.', + texture: 'Ultra-sharp material details, visible surface finishes (brushed metal, glass clarity, fabric weave), pristine.', + }, + FASHION: { + reference: 'Vogue editorial, Annie Leibovitz portraits, high-fashion runway photography', + lighting: 'Dramatic fashion lighting — beauty dish from above, clamshell setup, or single Profoto strobe with modifier.', + lens: '85mm portrait lens with creamy f/1.8 bokeh, or 35mm editorial wide for environmental fashion.', + color: 'High-fashion color grading — lifted blacks, color-tinted shadows, editorial mood-specific palettes.', + texture: 'Fabric texture detail visible, skin retouching (frequency separation look), magazine-print quality.', + }, + AERIAL: { + reference: 'Drone photography, DJI Mavic, National Geographic aerial, Google Earth perspective', + lighting: 'Natural sunlight from above with long shadows (golden hour ideal), atmospheric haze in distance.', + lens: 'Wide angle drone camera (24mm equivalent), deep focus f/5.6, straight-down or 45-degree angle.', + color: 'Vivid natural landscape colors enhanced — deep greens, turquoise water, golden sand, earth tones.', + texture: 'Ultra-sharp aerial detail, visible terrain texture, atmospheric perspective fading distant objects.', + }, + MACRO: { + reference: 'Extreme close-up nature photography, Nikon Small World, scientific imaging', + lighting: 'Ring flash or dual macro flash for even close-up illumination, focus stacked lighting.', + lens: 'True macro 1:1 or greater magnification, 100mm macro lens, razor-thin DOF at f/2.8.', + color: 'Vivid detail colors invisible to naked eye, iridescent surfaces, micro-texture color variations.', + texture: 'Extreme detail — visible cell structures, surface micro-textures, water droplets, compound eye facets.', + }, + PORTRAIT: { + reference: 'Annie Leibovitz, Peter Lindbergh, classic studio portraiture, environmental portraits', + lighting: 'Rembrandt or loop lighting from 45° camera-right, reflector fill from camera-left, hair light from behind.', + lens: '85mm f/1.4 portrait lens with beautiful circular bokeh, or 50mm for environmental context.', + color: 'Skin-tone-faithful rendering, warm and flattering, slight warm grade on highlights.', + texture: 'Natural skin texture (not over-smoothed), catch-light in eyes, subtle background separation.', + }, + }; + + return dnaMap[videoStyle] || dnaMap['CINEMATIC']; + } + private parseAndValidateScript(rawText: string): GeneratedScript { let parsed: GeneratedScript; try { diff --git a/std_res.json b/std_res.json new file mode 100644 index 0000000..d5d3948 --- /dev/null +++ b/std_res.json @@ -0,0 +1 @@ +{"success":true,"status":200,"message":"common.success","data":{"id":"29de08a8-f4f5-40ae-927f-cf28f37d5d8b","title":"Test Std Project","description":null,"prompt":"Belgesel","scriptJson":null,"scriptVersion":0,"language":"tr","aspectRatio":"PORTRAIT_9_16","videoStyle":"CINEMATIC","targetDuration":60,"seoKeywords":[],"seoTitle":null,"seoDescription":null,"seoSchemaJson":null,"socialContent":null,"referenceUrl":null,"sourceType":"MANUAL","sourceTweetData":null,"status":"DRAFT","progress":0,"errorMessage":null,"finalVideoUrl":null,"thumbnailUrl":null,"creditsUsed":0,"viewCount":0,"isTemplate":false,"templateId":null,"userId":"4405b182-3145-409e-9b1a-300ff5a8f746","createdAt":"2026-04-05T16:59:50.013Z","updatedAt":"2026-04-05T16:59:50.013Z","completedAt":null,"deletedAt":null},"errors":[]} \ No newline at end of file diff --git a/test-api-projects.js b/test-api-projects.js new file mode 100644 index 0000000..682c9a8 --- /dev/null +++ b/test-api-projects.js @@ -0,0 +1,14 @@ +const { PrismaClient } = require('@prisma/client'); +const prisma = new PrismaClient(); + +async function check() { + const allUsers = await prisma.user.findMany(); + console.log("Users:", allUsers.map(u => u.email + " -> " + u.id)); + + const allProjects = await prisma.project.findMany(); + console.log("Projects total:", allProjects.length); + for (const p of allProjects) { + console.log(`- ID: ${p.id}, User ID: ${p.userId}, Title: ${p.title}`); + } +} +check().finally(() => prisma.$disconnect()); diff --git a/test-api.js b/test-api.js new file mode 100644 index 0000000..414520a --- /dev/null +++ b/test-api.js @@ -0,0 +1,56 @@ +async function test() { + try { + // 1. Admin login + const loginRes = await fetch('http://localhost:3000/api/auth/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ email: 'admin@contentgen.ai', password: 'Admin123!' }) + }); + const loginData = await loginRes.json(); + const token = loginData.data.accessToken; + console.log("Logged in!"); + + // 2. Create project from standard prompt + console.log("\n--- Creating standard project..."); + const projRes = await fetch('http://localhost:3000/api/projects', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + title: "Test Project", + prompt: "Uzay hakkında bir belgesel", + language: "tr", + videoStyle: "CINEMATIC", + aspectRatio: "PORTRAIT_9_16" + }) + }); + const projData = await projRes.json(); + console.log("Standard project status:", projRes.status); + console.log("Standard project result:", JSON.stringify(projData, null, 2)); + + // 3. Create project from tweet + console.log("\n--- Creating tweet project..."); + const tweetRes = await fetch('http://localhost:3000/api/projects/from-tweet', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + tweetUrl: "https://x.com/elonmusk/status/1893456789012345678", + language: "tr", + videoStyle: "CINEMATIC", + aspectRatio: "PORTRAIT_9_16" + }) + }); + const tweetData = await tweetRes.json(); + console.log("Tweet project status:", tweetRes.status); + console.log("Tweet project result:", JSON.stringify(tweetData, null, 2)); + + } catch (err) { + console.error("Error:", err); + } +} +test(); diff --git a/test-curl-list.sh b/test-curl-list.sh new file mode 100755 index 0000000..4359750 --- /dev/null +++ b/test-curl-list.sh @@ -0,0 +1,17 @@ +#!/bin/bash +LOGIN_RES=$(curl -s -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"email":"admin@contentgen.ai","password":"Admin123!"}') + +TOKEN=$(echo $LOGIN_RES | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4) +if [ -z "$TOKEN" ]; then + echo "Login failed!" + exit 1 +fi + +echo "Fetching projects..." +curl -s -X GET http://localhost:3000/api/projects \ + -H "Authorization: Bearer $TOKEN" > list_res.json + +echo "Raw List Response:" +cat list_res.json diff --git a/test-curl-standard.sh b/test-curl-standard.sh new file mode 100755 index 0000000..921d2f4 --- /dev/null +++ b/test-curl-standard.sh @@ -0,0 +1,27 @@ +#!/bin/bash +echo "Logging in..." +LOGIN_RES=$(curl -s -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"email":"admin@contentgen.ai","password":"Admin123!"}') + +TOKEN=$(echo $LOGIN_RES | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4) +if [ -z "$TOKEN" ]; then + echo "Login failed!" + exit 1 +fi + +echo "Creating standard project..." +curl -s -X POST http://localhost:3000/api/projects \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN" \ + -d '{"title":"Test Std Project","prompt":"Belgesel","language":"tr","videoStyle":"CINEMATIC","aspectRatio":"PORTRAIT_9_16","targetDuration":60}' > std_res.json + +echo "Raw Standard Response:" +cat std_res.json + +echo -e "\nListing ALL projects..." +curl -s -X GET "http://localhost:3000/api/projects?limit=5" \ + -H "Authorization: Bearer $TOKEN" > list_res.json + +echo "Raw List Response:" +cat list_res.json diff --git a/test-curl-tweet.sh b/test-curl-tweet.sh new file mode 100755 index 0000000..1b6387d --- /dev/null +++ b/test-curl-tweet.sh @@ -0,0 +1,19 @@ +#!/bin/bash +LOGIN_RES=$(curl -s -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"email":"admin@contentgen.ai","password":"Admin123!"}') + +TOKEN=$(echo $LOGIN_RES | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4) +if [ -z "$TOKEN" ]; then + echo "Login failed!" + exit 1 +fi + +echo "Creating from tweet..." +curl -s -X POST http://localhost:3000/api/projects/from-tweet \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN" \ + -d '{"tweetUrl":"https://x.com/NightSkyNow/status/1888497676747206744"}' > tweet_res.json + +echo "Raw Tweet Response:" +cat tweet_res.json diff --git a/test-curl.sh b/test-curl.sh new file mode 100755 index 0000000..6661ea4 --- /dev/null +++ b/test-curl.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# 1. Login +echo "Logging in..." +LOGIN_RES=$(curl -s -X POST http://localhost:3000/api/auth/login \ + -H "Content-Type: application/json" \ + -d '{"email":"admin@contentgen.ai","password":"Admin123!"}') + +TOKEN=$(echo $LOGIN_RES | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4) +if [ -z "$TOKEN" ]; then + echo "Login failed! Response: $LOGIN_RES" + exit 1 +fi +echo "Got token." + +# 2. Create project +echo "Creating project..." +curl -s -X POST http://localhost:3000/api/projects/from-tweet \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN" \ + -d '{"tweetUrl":"https://x.com/elonmusk/status/1893456789012345678","language":"tr","videoStyle":"CINEMATIC","aspectRatio":"PORTRAIT_9_16"}' > proj_res.json + +echo "Raw Server Response:" +cat proj_res.json diff --git a/test-db.js b/test-db.js new file mode 100644 index 0000000..dc05726 --- /dev/null +++ b/test-db.js @@ -0,0 +1,9 @@ +const { PrismaClient } = require('@prisma/client'); +const prisma = new PrismaClient(); +async function main() { + const projects = await prisma.project.findMany({ select: { id: true, userId: true, title: true, status: true, deletedAt: true } }); + console.log('Projects:', projects); + const users = await prisma.user.findMany({ select: { id: true, email: true } }); + console.log('Users:', users); +} +main().catch(console.error).finally(() => prisma.$disconnect()); diff --git a/test-db.ts b/test-db.ts new file mode 100644 index 0000000..da6d55a --- /dev/null +++ b/test-db.ts @@ -0,0 +1,15 @@ +import { PrismaClient } from '@prisma/client'; +const db = new PrismaClient(); +async function run() { + const adminUser = await db.user.findUnique({ where: { email: 'admin@contentgen.ai' } }); + console.log("Admin ID:", adminUser?.id); + + const projects = await db.project.findMany({ + orderBy: { createdAt: 'desc' }, + take: 5, + select: { id: true, title: true, createdAt: true, userId: true } + }); + console.log("Last 5 projects:", projects); + await db.$disconnect(); +} +run(); diff --git a/test-fetch.cjs b/test-fetch.cjs new file mode 100644 index 0000000..2df930c --- /dev/null +++ b/test-fetch.cjs @@ -0,0 +1,23 @@ +const http = require('http'); +async function test() { + const req = http.request({ + hostname: 'localhost', + port: 3000, + path: '/api/projects', + method: 'GET', + headers: { + 'Accept': 'application/json' + } + }, (res) => { + let rawData = ''; + res.on('data', (chunk) => rawData += chunk); + res.on('end', () => { + console.log('Status code:', res.statusCode); + console.log('Raw data length:', rawData.length); + console.log('Raw data start:', rawData.slice(0, 200)); + }); + }); + req.on('error', (e) => console.error(`problem with request: ${e.message}`)); + req.end(); +} +test(); diff --git a/test-fetch.js b/test-fetch.js new file mode 100644 index 0000000..832c85f --- /dev/null +++ b/test-fetch.js @@ -0,0 +1,24 @@ +const axios = require('axios'); +const http = require('http'); +async function test() { + const req = http.request({ + hostname: 'localhost', + port: 3000, + path: '/api/projects', + method: 'GET', + headers: { + 'Accept': 'application/json' + } + }, (res) => { + let rawData = ''; + res.on('data', (chunk) => rawData += chunk); + res.on('end', () => { + console.log('Status code:', res.statusCode); + console.log('Raw data length:', rawData.length); + console.log('Raw data start:', rawData.slice(0, 200)); + }); + }); + req.on('error', (e) => console.error(`problem with request: ${e.message}`)); + req.end(); +} +test(); diff --git a/test-out.txt b/test-out.txt new file mode 100644 index 0000000..7c7b6df --- /dev/null +++ b/test-out.txt @@ -0,0 +1,695 @@ +[ + { + id: '0877428b-68e5-4882-923c-e97183c2f0a1', + title: '🚨 A neurotechnology breakthrough may have just turned science fiction into reality', + description: "@NightSkyNow tweet'inden üretildi — 8191 beğeni, 2474290 görüntülenme", + prompt: '[X/Twitter Kaynak İçerik]\n' + + 'Yazar: @NightSkyNow (Night Sky Now)\n' + + 'Etkileşim: 8.2K beğeni, 1.1K retweet, 2.5M görüntülenme\n' + + '\n' + + 'Tweet İçeriği:\n' + + '🚨 A neurotechnology breakthrough may have just turned science fiction into reality. A Silicon Valley startup called REMspace claims to have achieved the first successful communication between two people during a lucid dream — an unprecedented step in the study of consciousness and sleep. \n' + + '\n' + + 'Using EEG monitors, eye-tracking sensors, and a custom-coded dream language named “Remmyo,” researchers reportedly managed to transmit a single word from one dreamer to another — all while both remained asleep and lucid. The experiment represents a one-way exchange but demonstrates that structured messages could, in theory, travel between two dreaming minds.\n' + + '\n' + + 'CEO Michael Raduga says this is “just the beginning,” envisioning a future where dream-to-dream communication becomes a new frontier of neurotechnology. If expanded, this could revolutionize how we study memory, creativity, trauma therapy, and even human connection in subconscious states.\n' + + '\n' + + 'Reference:\n' + + '\n' + + 'Raduga, M., Shashkov, A., & Vanin, A. (2024). Two-way control of a virtual avatar from lucid dreams. International Journal of Dream Research, 17(1). \n' + + '\n' + + '#FutureTech #Neuroscience #MindSharing\n' + + '\n' + + 'Medya: 1 fotoğraf\n' + + 'Referans Görseller (senaryoda kullanılabilir):\n' + + ' Görsel 1: https://pbs.twimg.com/media/G_iVOtraIAAxL6u.jpg?name=orig\n' + + '\n' + + "Bu tweet içeriğinden etkileyici bir shorts videosu senaryosu oluştur. Tweet'in viral olma nedenlerini analiz et ve izleyiciyi yakalayan bir anlatım kur. Tweet'teki görselleri referans olarak kullan, ayrıca AI ile yeni görseller de üret.", + scriptJson: { + seo: { + title: 'Rüya İletişimi: Berrak Rüyalarda İnsan Zihni Bağlandı!', + hashtags: [ + 'Rüyaİletişimi', + 'Neuroteknoloji', + 'Bilinç', + 'BilimKurgu', + 'REMspace', + 'UykuBilimi', + 'Shorts' + ], + keywords: [ + 'Rüya iletişimi', + 'Lucid rüya', + 'Neuroteknoloji', + 'Bilinç çalışmaları', + 'REMspace', + 'Bilim kurgu gerçek oldu', + 'Gelecek teknolojileri', + 'Zihin paylaşımı', + 'Uyku araştırmaları', + 'Travma terapisi', + 'Hafıza', + 'Yaratıcılık' + ], + description: "REMspace'in çığır açan rüya iletişimi deneyiyle bilim kurgu gerçeğe dönüştü. Nöroteknoloji, bilinç çalışmaları ve insan bağlantısı için yeni bir çağ başlıyor. Detayları keşfedin.", + schemaMarkup: { + name: 'Rüya İletişimi: Berrak Rüyalarda İnsan Zihni Bağlandı!', + '@type': 'VideoObject', + duration: 'PT60S', + description: "REMspace'in çığır açan rüya iletişimi deneyiyle bilim kurgu gerçeğe dönüştü. Nöroteknoloji, bilinç çalışmaları ve insan bağlantısı için yeni bir çağ başlıyor. Detayları keşfedin." + } + }, + scenes: [ + { + order: 1, + title: 'Hook: Rüya İletişimi', + subtitleText: 'Rüyalarda İletişim Mümkün mü?', + visualPrompt: 'A highly detailed, translucent human head sculpture in the foreground, made of brushed titanium and frosted glass, with an intricate, bioluminescent neural network glowing softly within its skull. Faint, abstract holographic data streams in electric blue and amber pulse around it, creating subtle refractions on the glass surface. The subject is perfectly centered in a dark, minimalist futuristic lab, with subtle reflections on a polished black floor. Blade Runner 2049 color palette with heavy teal-and-amber contrast, Denis Villeneuve visual language, desolate monumental scale, evoking a sense of profound mystery and technological awe. Dramatic key light from an unseen overhead source creating deep shadows beneath the jawline, with a soft amber fill light originating from the holographic elements. Medium close-up, eye-level, static locked-off tripod. Razor-thin f/1.4 bokeh focusing only on the glowing neural network, shot on 35mm anamorphic film with subtle grain, desaturated teal-and-orange color grade with crushed blacks, gentle anamorphic lens flare from the glowing data streams. Avoid: text overlays, watermarks, brand logos, distorted anatomy, generic clip art style.', + narrationText: 'Bir rüyada, başkasıyla konuşabileceğinizi düşündünüz mü hiç? Bilim kurgu gerçek oluyor!', + transitionType: 'CUT', + durationSeconds: 5, + ambientSoundPrompt: 'subtle, low hum of advanced electronics, faint distant digital beeps, and a deep, resonant, evolving synth pad creating an atmosphere of mystery' + }, + { + order: 2, + title: 'The Breakthrough', + subtitleText: 'REMspace: Rüya İletişimi', + visualPrompt: 'Continuing the Blade Runner 2049 visual language from previous scenes: Two subjects, a man and a woman in their late 20s, with serene expressions, lying side-by-side on sleek, dark gray pillows in a minimalist, dimly lit private research chamber. Each wears a futuristic, ergonomic EEG headset made of matte black polymer with subtle, pulsating electric blue lights over the temples. Faint, high-tech eye-tracking sensors are visible around their eyelids. A single, cold blue-white light (6000K) emanates from an off-screen monitor to camera-right, casting sharp, long shadows across their faces and the crisp white sheets, creating a clinical yet mysterious atmosphere. Medium close-up shot from a slightly high angle, slowly pushing in towards their faces. Shallow depth of field f/2.8, focusing on the EEG devices, shot on 35mm anamorphic film with characteristic oval bokeh, teal-and-orange color grade with cool highlights and deep shadows, subtle film grain. Avoid: text overlays, watermarks, brand logos, generic faces, blurry faces, oversaturated CGI.', + narrationText: "Geçenlerde @NightSkyNow'dan inanılmaz bir tweet gördüm. REMspace adlı bir şirket, berrak rüya sırasında iki kişi arasında iletişim kurmayı başarmış!", + transitionType: 'CUT', + durationSeconds: 9, + ambientSoundPrompt: 'soft, rhythmic pulses of a heartbeat monitor, gentle whirring of cooling fans, distant subtle whispers like a dream, with a high-tech metallic click sound' + }, + { + order: 3, + title: 'The Method Explained', + subtitleText: "EEG, Göz Takibi ve 'Remmyo'", + visualPrompt: `Continuing the Blade Runner 2049 visual language from previous scenes: Extreme close-up on a translucent, curved OLED display showing complex, real-time brainwave patterns rendered as undulating electric blue and amber lines against a deep black background, resembling the reference image's glowing nodes. For a brief moment, a single, glowing Turkish word "MERHABA" (Hello) in a sleek, futuristic font materializes in the center of the screen, then subtly dissolves. The screen's light is the primary source, casting a soft, blue-amber glow onto the dark, brushed metal bezel of the monitor and subtly reflecting on a researcher's gloved hand at the very bottom of the frame. Soft, diffused screen glow (4500K) illuminates the immediate foreground, with reflections on the glossy screen surface. Eye-level, perfectly centered composition, static locked-off tripod. Medium depth of field f/4, everything on the screen is sharp, shot on 65mm IMAX large format for ultra-sharp detail, high-contrast desaturated teal-and-orange color grade, clean digital aesthetic with very subtle screen pixelation and bloom on the glowing text. Avoid: text overlays (except the word "MERHABA"), watermarks, brand logos, generic UI, blurry elements.`, + narrationText: "EEG monitörleri, göz takip sensörleri ve özel 'Remmyo' dili kullanarak, bir rüyacının diğerine tek bir kelime iletmesini sağlamışlar. İnanılmaz!", + transitionType: 'CUT', + durationSeconds: 11, + ambientSoundPrompt: 'crisp, digital interface sounds, soft data stream whooshes, and subtle, high-frequency brainwave-like tones' + }, + { + order: 4, + title: "Michael Raduga's Vision", + subtitleText: 'Yeni Nöroteknoloji Sınırı', + visualPrompt: 'Continuing the Blade Runner 2049 visual language from previous scenes: A solitary, visionary figure (resembling CEO Michael Raduga, but not an exact likeness) in a dark, tailored suit, stands in the foreground, silhouetted against a vast, cavernous, futuristic data center. Rows of towering, monolithic server racks with pulsating teal and amber lights stretch into the far background, reflecting endlessly on a highly polished, obsidian-like floor. The figure is gazing upwards at a large, ethereal holographic projection of interconnected neural pathways floating in the mid-air, casting subtle ambient light. The primary light source is the glowing server racks and the holographic projection, creating dramatic backlighting and rim light around the figure, with deep, impenetrable shadows filling the foreground. Wide establishing shot from a low angle, slowly dollying forward. Shallow depth of field f/2.0, focusing on the figure and the hologram, shot on 35mm anamorphic film with subtle grain, desaturated teal-and-orange grade with crushed blacks and dramatic contrast, subtle light bloom from the server lights. Avoid: text overlays, watermarks, brand logos, recognizable faces, distorted anatomy.', + narrationText: 'CEO Michael Raduga, bunun sadece bir başlangıç olduğunu söylüyor. Rüya içi iletişimin nöroteknolojinin yeni sınırı olacağını hayal ediyor.', + transitionType: 'CUT', + durationSeconds: 13, + ambientSoundPrompt: 'deep, resonant thrumming of large servers, occasional soft electronic chimes, and a low, distant bass drone creating a sense of scale' + }, + { + order: 5, + title: 'Revolutionizing Consciousness', + subtitleText: 'Hafıza, Terapi, Bağlantı', + visualPrompt: 'Continuing the Blade Runner 2049 visual language from previous scenes: Abstract, fluid visuals dynamically morphing on a large, semi-transparent screen or holographic surface, representing the intricate interplay of memory, creativity, and emotional connection. Glowing, ethereal tendrils of light (amber, deep violet, and electric blue) subtly connect two stylized, translucent human figures, their forms suggested rather than explicit, implying subconscious interaction and healing. The background is a soft, deep gradient of dark blue and violet. The scene is lit by the internal glow of these abstract forms and connections, creating a soft, diffused, dreamlike illumination with gentle light bloom and subtle refractions. Medium shot, slightly low angle, orbiting slowly around the central abstract forms. Shallow depth of field f/1.8, creating a dreamy, soft focus on the edges, shot on vintage Cooke anamorphic lens with characteristic oval bokeh, color graded with a fantastical, desaturated yet rich palette of deep blues, violets, and amber, gentle halation around the glowing elements. Avoid: text overlays, watermarks, brand logos, explicit human faces, sharp edges, generic stock imagery.', + narrationText: 'Bu, hafıza, yaratıcılık, travma terapisi ve bilinçaltı bağlantımızı nasıl incelediğimizi kökten değiştirebilir. Düşünsenize, bir rüyayla terapi!', + transitionType: 'CUT', + durationSeconds: 13, + ambientSoundPrompt: 'ethereal, shimmering synth pads, gentle woosh sounds as abstract forms morph, and a subtle, calming, low-frequency hum' + }, + { + order: 6, + title: 'Conclusion: The Future', + subtitleText: 'Rüyalarımızdaki Gelecek', + visualPrompt: "Continuing the Blade Runner 2049 visual language from previous scenes: A lone figure, silhouetted, sits on the edge of a bed, looking out through a large, rain-streaked window at a sprawling cyberpunk megacity, its neon lights (teal, magenta, amber) blurred and reflected on the wet glass. The figure is deep in contemplative thought, their back to the camera. The room is dimly lit by the cold, diffused light from the window and a single, warm bedside lamp (3000K) creating a small pool of light on a book on the nightstand, contrasting with the city's glow. Late-night atmosphere, dramatic backlighting from the city, with a soft fill from the bedside lamp. Medium shot, slightly high angle, static locked-off tripod. Shallow depth of field f/2.0, focusing on the figure and the reflections on the window, shot on 35mm Kodak Vision3 500T tungsten film with visible fine grain, color graded with a strong teal-and-orange split-tone, subtle vignette, rain droplets on the lens surface effect. Avoid: text overlays, watermarks, brand logos, clear facial features, generic bedroom setting.", + narrationText: 'Bu, sadece bilim kurgu değil. Bilinç ve insan bağlantısının geleceği rüyalarımızda yatıyor olabilir. Çok merak ediyorum, siz ne düşünüyorsunuz?', + transitionType: 'CUT', + durationSeconds: 9, + ambientSoundPrompt: 'gentle sound of rain hitting a window, distant muffled city sounds, and a soft, melancholic synth melody fading out' + } + ], + metadata: { + title: 'Rüya İletişimi: Bilim Kurgu Gerçek Oldu mu?', + hashtags: [ + 'Rüyaİletişimi', + 'Neuroteknoloji', + 'Bilinç', + 'BilimKurgu', + 'REMspace', + 'UykuBilimi', + 'Shorts' + ], + language: 'tr', + description: 'REMspace adlı bir startup, berrak rüyalar sırasında iki kişi arasında başarılı bir iletişim kurduğunu iddia ediyor. Bu, bilinç ve nöroteknoloji için ne anlama geliyor? #Rüyaİletişimi', + totalDurationSeconds: 60 + }, + musicStyle: 'cinematic-orchestral', + voiceStyle: 'male, late 30s, authoritative yet curious tone, measured pacing for exposition, slightly faster for the hook, clean and clear with a hint of warmth.', + musicPrompt: 'Cinematic orchestral trailer music, 110 BPM, minor key, building from a mysterious, ethereal opening with sustained strings and subtle synth pads, gradually incorporating deep brass and percussion to an epic, awe-inspiring climax, then resolving into a soft, contemplative outro. Hans Zimmer and Jóhann Jóhannsson influence.', + socialContent: { + twitterText: 'Rüya iletişimi gerçek oldu! 🤯 REMspace, berrak rüya sırasında iki kişi arasında tek kelimeyle iletişim kurduğunu iddia ediyor. Bilim kurgu gerçek mi oluyor? Zihinler arası bağlantı çağı başlıyor olabilir mi? #Rüyaİletişimi #Neuroteknoloji', + youtubeTitle: 'Rüya İletişimi: Bilim Kurgu Gerçek Oldu mu? #REMspace', + tiktokCaption: 'Rüyalarımızda konuşabilecek miyiz? 🤯 REMspace imkansızı başardı! Berrak rüya iletişimi gerçek oldu! #Rüyaİletişimi #Neuroteknoloji #BilimKurgu #Gelecek', + instagramCaption: 'Bir rüyada başka biriyle konuşmak... Kulağa imkansız geliyor, değil mi? Ama REMspace bunu başardı! 🤯 Berrak rüyalar sırasında iki kişi arasında tek kelimelik iletişim kurdular. Bu, bilinç ve insan bağlantısının geleceğini tamamen değiştirebilir. Siz ne düşünüyorsunuz? 🤔 #Rüyaİletişimi #Neuroteknoloji #Bilinç #BilimKurgu #REMspace #FutureTech', + youtubeDescription: "REMspace adlı bir startup, berrak rüyalar sırasında iki kişi arasında başarılı bir iletişim kurduğunu iddia etti! 🤯 Bu, nöroteknoloji ve bilinç çalışmaları için ne anlama geliyor? Gelecekte rüyalarımızda birbirimizle konuşabilecek miyiz? Bu çığır açan deney, hafıza, yaratıcılık, travma terapisi ve insan bağlantısı gibi alanları nasıl değiştirebilir? Michael Raduga'nın vizyonu ve bu teknolojinin potansiyelini keşfedin. Bilim kurgunun gerçeğe dönüştüğü bu inanılmaz gelişmeyi kaçırmayın! Siz bu konuda ne düşünüyorsunuz? Yorumlarda belirtin! 👇\n" + + '\n' + + "Kaynak: @NightSkyNow'un viral tweet'i ve Raduga, M., Shashkov, A., & Vanin, A. (2024). Two-way control of a virtual avatar from lucid dreams. International Journal of Dream Research, 17(1).\n" + + '\n' + + '#Rüyaİletişimi #Neuroteknoloji #Bilinç #BilimKurgu #REMspace #UykuBilimi #GelecekTeknolojileri #ZihinPaylaşımı #Shorts #YouTubeShorts #Bilim' + }, + musicTechnical: { + bpm: 110, + key: 'D minor', + instruments: [ + 'strings', + 'brass', + 'percussion', + 'synth pads', + 'subtle choir' + ], + emotionalArc: 'low-to-mid-to-high-to-fade' + }, + ambientSoundPrompts: [ + 'subtle, low hum of advanced electronics and distant digital beeps', + 'gentle sound of rain hitting a window with distant muffled city sounds', + 'ethereal, shimmering synth pads and subtle whooshes' + ] + }, + scriptVersion: 1, + language: 'tr', + aspectRatio: 'PORTRAIT_9_16', + videoStyle: 'CINEMATIC', + targetDuration: 60, + seoKeywords: [], + seoTitle: 'Rüya İletişimi: Berrak Rüyalarda İnsan Zihni Bağlandı!', + seoDescription: "REMspace'in çığır açan rüya iletişimi deneyiyle bilim kurgu gerçeğe dönüştü. Nöroteknoloji, bilinç çalışmaları ve insan bağlantısı için yeni bir çağ başlıyor. Detayları keşfedin.", + seoSchemaJson: { + name: 'Rüya İletişimi: Berrak Rüyalarda İnsan Zihni Bağlandı!', + '@type': 'VideoObject', + duration: 'PT60S', + description: "REMspace'in çığır açan rüya iletişimi deneyiyle bilim kurgu gerçeğe dönüştü. Nöroteknoloji, bilinç çalışmaları ve insan bağlantısı için yeni bir çağ başlıyor. Detayları keşfedin." + }, + socialContent: { + twitterText: 'Rüya iletişimi gerçek oldu! 🤯 REMspace, berrak rüya sırasında iki kişi arasında tek kelimeyle iletişim kurduğunu iddia ediyor. Bilim kurgu gerçek mi oluyor? Zihinler arası bağlantı çağı başlıyor olabilir mi? #Rüyaİletişimi #Neuroteknoloji', + youtubeTitle: 'Rüya İletişimi: Bilim Kurgu Gerçek Oldu mu? #REMspace', + tiktokCaption: 'Rüyalarımızda konuşabilecek miyiz? 🤯 REMspace imkansızı başardı! Berrak rüya iletişimi gerçek oldu! #Rüyaİletişimi #Neuroteknoloji #BilimKurgu #Gelecek', + instagramCaption: 'Bir rüyada başka biriyle konuşmak... Kulağa imkansız geliyor, değil mi? Ama REMspace bunu başardı! 🤯 Berrak rüyalar sırasında iki kişi arasında tek kelimelik iletişim kurdular. Bu, bilinç ve insan bağlantısının geleceğini tamamen değiştirebilir. Siz ne düşünüyorsunuz? 🤔 #Rüyaİletişimi #Neuroteknoloji #Bilinç #BilimKurgu #REMspace #FutureTech', + youtubeDescription: "REMspace adlı bir startup, berrak rüyalar sırasında iki kişi arasında başarılı bir iletişim kurduğunu iddia etti! 🤯 Bu, nöroteknoloji ve bilinç çalışmaları için ne anlama geliyor? Gelecekte rüyalarımızda birbirimizle konuşabilecek miyiz? Bu çığır açan deney, hafıza, yaratıcılık, travma terapisi ve insan bağlantısı gibi alanları nasıl değiştirebilir? Michael Raduga'nın vizyonu ve bu teknolojinin potansiyelini keşfedin. Bilim kurgunun gerçeğe dönüştüğü bu inanılmaz gelişmeyi kaçırmayın! Siz bu konuda ne düşünüyorsunuz? Yorumlarda belirtin! 👇\n" + + '\n' + + "Kaynak: @NightSkyNow'un viral tweet'i ve Raduga, M., Shashkov, A., & Vanin, A. (2024). Two-way control of a virtual avatar from lucid dreams. International Journal of Dream Research, 17(1).\n" + + '\n' + + '#Rüyaİletişimi #Neuroteknoloji #Bilinç #BilimKurgu #REMspace #UykuBilimi #GelecekTeknolojileri #ZihinPaylaşımı #Shorts #YouTubeShorts #Bilim' + }, + referenceUrl: null, + sourceType: 'X_TWEET', + sourceTweetData: { + text: '🚨 A neurotechnology breakthrough may have just turned science fiction into reality. A Silicon Valley startup called REMspace claims to have achieved the first successful communication between two people during a lucid dream — an unprecedented step in the study of consciousness and sleep. \n' + + '\n' + + 'Using EEG monitors, eye-tracking sensors, and a custom-coded dream language named “Remmyo,” researchers reportedly managed to transmit a single word from one dreamer to another — all while both remained asleep and lucid. The experiment represents a one-way exchange but demonstrates that structured messages could, in theory, travel between two dreaming minds.\n' + + '\n' + + 'CEO Michael Raduga says this is “just the beginning,” envisioning a future where dream-to-dream communication becomes a new frontier of neurotechnology. If expanded, this could revolutionize how we study memory, creativity, trauma therapy, and even human connection in subconscious states.\n' + + '\n' + + 'Reference:\n' + + '\n' + + 'Raduga, M., Shashkov, A., & Vanin, A. (2024). Two-way control of a virtual avatar from lucid dreams. International Journal of Dream Research, 17(1). \n' + + '\n' + + '#FutureTech #Neuroscience #MindSharing', + media: [ + { + url: 'https://pbs.twimg.com/media/G_iVOtraIAAxL6u.jpg?name=orig', + type: 'photo', + width: 1080, + height: 1350 + } + ], + metrics: { + likes: 8191, + views: 2474290, + replies: 577, + retweets: 1096, + engagementRate: 0.4 + }, + tweetId: '2015594285484454125', + isThread: false, + tweetUrl: 'https://x.com/NightSkyNow/status/2015594285484454125', + authorName: 'Night Sky Now', + viralScore: 35, + contentType: 'tweet', + threadCount: 1, + authorAvatar: 'https://pbs.twimg.com/profile_images/1993887980440948736/2fXTrKKP_200x200.jpg', + authorUsername: 'NightSkyNow' + }, + status: 'DRAFT', + progress: 0, + errorMessage: null, + finalVideoUrl: null, + thumbnailUrl: null, + creditsUsed: 0, + viewCount: 0, + isTemplate: false, + templateId: null, + userId: '4405b182-3145-409e-9b1a-300ff5a8f746', + createdAt: 2026-04-05T15:59:35.665Z, + updatedAt: 2026-04-05T16:00:12.804Z, + completedAt: null, + deletedAt: null + }, + { + id: 'a8da2d35-712d-49ce-8422-405c5dd114cb', + title: '🕳️ Evren Hakkında Bildiklerimizi Alt Üst Edebilecek Kara Delik Sırrı…', + description: "@DeepTechTR tweet'inden üretildi — 20 beğeni, 1401 görüntülenme", + prompt: '[X/Twitter Kaynak İçerik]\n' + + 'Yazar: @DeepTechTR (DeepTechTR 🇹🇷)\n' + + 'Etkileşim: 20 beğeni, 3 retweet, 1.4K görüntülenme\n' + + '\n' + + 'Tweet İçeriği:\n' + + '🕳️ Evren Hakkında Bildiklerimizi Alt Üst Edebilecek Kara Delik Sırrı…\n' + + '\n' + + 'Uzayda, yerçekiminin o kadar güçlü olduğu, ışığın bile kaçamadığı bir yer hayal edin. Bunlar kara delikler, evrenin en büyük gizemleri. Ama bilim insanlarının takıntılı olduğu bir nokta var: Bir kara delik tarafından yutulan tüm bilgilere ne oluyor? Fiziğe göre, bilgi öylece yok olamaz. Yine de, kara delikler her şeyi siliyor gibi görünüyor.\n' + + '\n' + + 'Bu bilmeceye Kara Delik Bilgi Paradoksu deniyor ve gerçekliğin temellerini sarsıyor. Bilgi yok olursa, kuantum fiziğinin yasaları çöker. Eğer bir şekilde hayatta kalırsa, bu kara deliklerin kozmik çöp kutularından ziyade kozmik kasalar gibi olduğu anlamına gelebilir.\n' + + '\n' + + 'Bazı bilim insanları cevabın kara deliğin kenarında, olay ufku adı verilen gizemli ince bir sınırda yattığını, burada gerçekliğin kendisinin yeniden yazılabileceğini öne sürüyor. Diğerleri ise holografik evrenler veya gizli boyutlar gibi akıl almaz fikirlere işaret ediyor.\n' + + '\n' + + ' Her kara delik, zaman, uzay ve gerçekliğin kendisi hakkında bildiğimizi sandığımız her şeye meydan okuyan sırlar saklıyor olabilir. Soru şu... çok geç olmadan onları ortaya çıkarabilecek miyiz?\n' + + '\n' + + 'Merak mı ediyorsunuz? Yalnız değilsiniz. Evren sırlarını fısıldıyor... dinliyor musunuz?\n' + + '\n' + + 'Medya: 1 fotoğraf\n' + + 'Referans Görseller (senaryoda kullanılabilir):\n' + + ' Görsel 1: https://pbs.twimg.com/media/HDDs5eEWIAAULoL.jpg?name=orig\n' + + '\n' + + "Bu tweet içeriğinden etkileyici bir shorts videosu senaryosu oluştur. Tweet'in viral olma nedenlerini analiz et ve izleyiciyi yakalayan bir anlatım kur. Tweet'teki görselleri referans olarak kullan, ayrıca AI ile yeni görseller de üret.", + scriptJson: { + seo: { + title: 'Kara Delik Sırrı: Evreni Yeniden Yazabilecek Mi?', + hashtags: [ + 'KaraDelik', + 'Uzay', + 'Bilim', + 'KuantumFiziği', + 'DeepTechTR', + 'EvrenSırları', + 'Shorts' + ], + keywords: [ + 'kara delik', + 'bilgi paradoksu', + 'kuantum fiziği', + 'olay ufku', + 'DeepTechTR', + 'uzay sırları', + 'evrenin gizemi', + 'teorik fizik', + 'kozmoloji', + 'bilim', + 'shorts', + 'galaksi' + ], + description: "Kara deliklerin yuttuğu bilgilere ne oluyor? @DeepTechTR'nin paylaştığı bu gizem, kuantum fiziğini ve evren anlayışımızı kökten değiştirebilir. Olay ufku, holografik evrenler ve bilgi paradoksu hakkında bilinmeyenler.", + schemaMarkup: { + name: 'Kara Delik Sırrı: Evreni Yeniden Yazabilecek Mi?', + '@type': 'VideoObject', + duration: 'PT70S', + description: 'Kara deliklerin yuttuğu bilgilere ne oluyor? Bu gizem, kuantum fiziğini ve evren anlayışımızı kökten değiştirebilir. Bilgi paradoksu hakkında bilinmeyenler.' + } + }, + scenes: [ + { + order: 1, + title: 'Kara Delik Sırrı', + subtitleText: 'Kara delik sırrı?', + visualPrompt: 'A mysterious, deep space black hole with a faint accretion disk, slowly pulling in cosmic dust and gas. Close-up, dark moody lighting, slow zoom into the swirling vortex.', + narrationText: 'Evren hakkında bildiğimiz her şeyi alt üst edebilecek o kara delik sırrını kimse konuşmuyor sanırım.', + transitionType: 'CUT', + durationSeconds: 4, + ambientSoundPrompt: 'Distant, low frequency cosmic hum with subtle gravitational wave ripples.' + }, + { + order: 2, + title: 'Işık Bile Kaçamaz', + subtitleText: 'Işık bile kaçamaz', + visualPrompt: 'Extreme wide shot of a supermassive black hole dominating the frame, its event horizon razor-sharp against a backdrop of myriad stars. Camera orbits slowly, revealing the sheer scale and immense gravity.', + narrationText: "DeepTechTR'nin de işaret ettiği gibi, uzayda öyle noktalar var ki, ışık bile oradan kaçamıyor. İşte bunlar kara delikler.", + transitionType: 'CUT', + durationSeconds: 9, + ambientSoundPrompt: 'Deep space ambient drone with subtle, high-pitched stellar winds.' + }, + { + order: 3, + title: 'Bilgi Nereye Gidiyor?', + subtitleText: 'Bilgi nereye gidiyor?', + visualPrompt: 'Abstract, glowing particles and intricate data patterns, like a stream of pure information, being inexorably drawn into a swirling, dark abyss. Smooth push-in through the collapsing data.', + narrationText: 'Ama asıl soru şu: Bir kara delik her şeyi yuttuğunda, o tüm bilgilere gerçekten ne oluyor? Bilim insanları buna takıntılı.', + transitionType: 'CUT', + durationSeconds: 10, + ambientSoundPrompt: 'Subtle, electronic data processing sounds mixing with a low, distant hum.' + }, + { + order: 4, + title: 'Bilgi Paradoksu', + subtitleText: 'Bilgi paradoksu', + visualPrompt: 'A conceptual split screen. One side shows vibrant, ordered quantum particles representing intact information. The other side shows a chaotic, dissolving void where particles vanish into nothingness. High-contrast lighting.', + narrationText: "Fizik yasalarına göre, bilgi asla yok olamaz. Ama kara delikler, sanki her şeyi siliyor. Bu bilmeceye 'Kara Delik Bilgi Paradoksu' deniyor.", + transitionType: 'CUT', + durationSeconds: 11, + ambientSoundPrompt: 'Hissing sound of static electricity mixed with a subtle, unnerving hum.' + }, + { + order: 5, + title: 'Gerçeklik Değişebilir', + subtitleText: 'Gerçeklik değişebilir', + visualPrompt: 'A shimmering, fragile holographic projection of cosmic laws and equations, starting to crack and distort. Camera slowly pulls back to reveal the scale of this broken reality. Surreal, dreamlike atmosphere.', + narrationText: 'Eğer bilgi gerçekten kaybolursa, o zaman kuantum fiziğinin temel yasaları tamamen çökerdi. Bu, gerçekliğin kendisini bile değiştirebilir.', + transitionType: 'CUT', + durationSeconds: 10, + ambientSoundPrompt: 'Ethereal, glass-shattering sound design layered with a low, resonant hum.' + }, + { + order: 6, + title: 'Kozmik Bilgi Kasası', + subtitleText: 'Kozmik bilgi kasası?', + visualPrompt: 'Slow, dolly forward towards the event horizon of a black hole, which now shimmers with faint, intricate patterns of light and energy, suggesting hidden, encoded data. Golden hour lighting, warm amber tones.', + narrationText: 'Peki ya bilgi bir şekilde hayatta kalıyorsa? O zaman kara delikler, kozmik bir çöp kutusu değil, devasa bir bilgi kasası olabilir mi?', + transitionType: 'CUT', + durationSeconds: 10, + ambientSoundPrompt: 'Soft, rhythmic pulses, like an encoded signal from deep space.' + }, + { + order: 7, + title: 'Olay Ufku Sırrı', + subtitleText: 'Olay ufku sırrı', + visualPrompt: 'Close-up on the event horizon, which appears as a rippling, ethereal surface. Subtle glimpses of impossible geometries or faint, ghost-like reflections of other dimensions are visible within its depths. Mysterious, reflective lighting.', + narrationText: 'Bazı bilim insanları cevabın, olay ufku denilen o gizemli ince sınırda yattığını düşünüyor. Ya da belki holografik evrenler, hatta gizli boyutlar var?', + transitionType: 'CUT', + durationSeconds: 10, + ambientSoundPrompt: 'Whispering, atmospheric sound that suggests unseen forces or hidden dimensions.' + }, + { + order: 8, + title: 'Sırları Çözebilecek Miyiz?', + subtitleText: 'Sırları çözebilecek miyiz?', + visualPrompt: 'An awe-inspiring, extreme wide aerial drone shot of a majestic black hole, slowly orbiting, with countless distant galaxies spread across the cosmic canvas. A sense of profound mystery and wonder. Dark, deep space palette.', + narrationText: 'Her kara delik, zaman, uzay ve gerçeklik hakkındaki tüm bildiklerimize meydan okuyan sırlar saklıyor. Çok geç olmadan onları ortaya çıkarabilecek miyiz?', + transitionType: 'FADE', + durationSeconds: 6, + ambientSoundPrompt: 'Expansive, deep space ambience with a final, lingering cosmic hum.' + } + ], + metadata: { + title: 'Kara Delik Sırrı: Evreni Yeniden Yazabilecek Mi?', + hashtags: [ + 'KaraDelik', + 'Uzay', + 'Bilim', + 'KuantumFiziği', + 'DeepTechTR', + 'EvrenSırları', + 'Shorts' + ], + language: 'tr', + description: 'Kara deliklerin yuttuğu bilgilere ne oluyor? Bu gizem, kuantum fiziğini ve evren anlayışımızı kökten değiştirebilir. Bilgi paradoksu hakkında bilinmeyenler.', + totalDurationSeconds: 70 + }, + musicStyle: 'cinematic-orchestral', + voiceStyle: 'Male, 30s, authoritative yet mysterious tone. Pacing is measured for data, slightly slower for dramatic reveals. Clean audio, with a subtle, very slight reverb for epic moments.', + musicPrompt: 'Cinematic orchestral music, 95 BPM, C minor, starting with low, mysterious strings and deep synth pads, gradually building tension with brass swells and subtle percussion, leading to an epic, awe-inspiring climax, then fading out with ambient echoes.', + socialContent: { + twitterText: `Kara deliklerin yuttuğu bilgiler nereye gidiyor? 🤯 @DeepTechTR'nin bahsettiği bu "Bilgi Paradoksu" tüm fiziği alt üst ediyor. Olay ufku mu, holografik evrenler mi? Gerçeklik sandığımızdan çok daha garip olabilir. #KaraDelik #Kuantum`, + youtubeTitle: 'Kara Delik Sırrı: Evreni Yeniden Yazabilecek Mi?', + tiktokCaption: "Kara deliklerin bu sırrı tüm bildiğimizi değiştirebilir! 🤯 Bilgi gerçekten yok oluyor mu? @DeepTechTR'nin paylaştığı bu paradoks kafamı karıştırdı! #KaraDelik #Uzay #Bilim #Kuantum #EvrenSırları", + instagramCaption: `Kara deliklerin yuttuğu bilgilere ne oluyor? 🤔 Bu "Bilgi Paradoksu" kuantum fiziğini ve evren anlayışımızı kökten sarsıyor. Olay ufku, holografik evrenler... Gerçeklik bildiğimizden çok farklı olabilir! @DeepTechTR'nin de dikkat çektiği bu gizem hakkında sen ne düşünüyorsun? 👇 #KaraDelik #Uzay #BilimSırları #KuantumFiziği #Evren`, + youtubeDescription: `@DeepTechTR'nin paylaştığı akıl almaz bir sır: Kara delikler bilgiyi yok ediyor mu? 🤔 Fizik yasalarına göre imkansız gibi görünse de, bu durum "Kara Delik Bilgi Paradoksu" olarak biliniyor ve kuantum fiziğinin temellerini sarsıyor. Evrenin en büyük gizemlerinden birini, yani kara deliklerin yuttuğu bilgilere ne olduğunu hiç merak ettiniz mi? Olay ufku, holografik evrenler ve gizli boyutlar gibi teorilerle, gerçeklik anlayışımızı yeniden şekillendirebilecek bu derin konuya dalıyoruz. Bilim insanları bu sırrı çözebilecek mi? Yorumlarda düşüncelerinizi paylaşın ve daha fazla derinlemesine bilim videosu için kanalımıza abone olun! #KaraDelik #BilgiParadoksu #KuantumFiziği #UzaySırları #DeepTechTR #Evren #Bilim #Shorts [Videoyu beğenmeyi ve arkadaşlarınızla paylaşmayı unutmayın!]` + }, + musicTechnical: { + bpm: 95, + key: 'C minor', + instruments: [ + 'strings', + 'brass', + 'deep synth pads', + 'subtle percussion', + 'ethereal choir' + ], + emotionalArc: 'low-to-medium-tension-to-awe-to-fade' + }, + ambientSoundPrompts: [ + 'Deep space ambient drone with subtle gravitational wave ripples', + 'Subtle, electronic data processing sounds mixing with a low, distant hum', + 'Expansive, deep space ambience with a final, lingering cosmic hum' + ] + }, + scriptVersion: 1, + language: 'tr', + aspectRatio: 'PORTRAIT_9_16', + videoStyle: 'CINEMATIC', + targetDuration: 74, + seoKeywords: [], + seoTitle: 'Kara Delik Sırrı: Evreni Yeniden Yazabilecek Mi?', + seoDescription: "Kara deliklerin yuttuğu bilgilere ne oluyor? @DeepTechTR'nin paylaştığı bu gizem, kuantum fiziğini ve evren anlayışımızı kökten değiştirebilir. Olay ufku, holografik evrenler ve bilgi paradoksu hakkında bilinmeyenler.", + seoSchemaJson: { + name: 'Kara Delik Sırrı: Evreni Yeniden Yazabilecek Mi?', + '@type': 'VideoObject', + duration: 'PT70S', + description: 'Kara deliklerin yuttuğu bilgilere ne oluyor? Bu gizem, kuantum fiziğini ve evren anlayışımızı kökten değiştirebilir. Bilgi paradoksu hakkında bilinmeyenler.' + }, + socialContent: { + twitterText: `Kara deliklerin yuttuğu bilgiler nereye gidiyor? 🤯 @DeepTechTR'nin bahsettiği bu "Bilgi Paradoksu" tüm fiziği alt üst ediyor. Olay ufku mu, holografik evrenler mi? Gerçeklik sandığımızdan çok daha garip olabilir. #KaraDelik #Kuantum`, + youtubeTitle: 'Kara Delik Sırrı: Evreni Yeniden Yazabilecek Mi?', + tiktokCaption: "Kara deliklerin bu sırrı tüm bildiğimizi değiştirebilir! 🤯 Bilgi gerçekten yok oluyor mu? @DeepTechTR'nin paylaştığı bu paradoks kafamı karıştırdı! #KaraDelik #Uzay #Bilim #Kuantum #EvrenSırları", + instagramCaption: `Kara deliklerin yuttuğu bilgilere ne oluyor? 🤔 Bu "Bilgi Paradoksu" kuantum fiziğini ve evren anlayışımızı kökten sarsıyor. Olay ufku, holografik evrenler... Gerçeklik bildiğimizden çok farklı olabilir! @DeepTechTR'nin de dikkat çektiği bu gizem hakkında sen ne düşünüyorsun? 👇 #KaraDelik #Uzay #BilimSırları #KuantumFiziği #Evren`, + youtubeDescription: `@DeepTechTR'nin paylaştığı akıl almaz bir sır: Kara delikler bilgiyi yok ediyor mu? 🤔 Fizik yasalarına göre imkansız gibi görünse de, bu durum "Kara Delik Bilgi Paradoksu" olarak biliniyor ve kuantum fiziğinin temellerini sarsıyor. Evrenin en büyük gizemlerinden birini, yani kara deliklerin yuttuğu bilgilere ne olduğunu hiç merak ettiniz mi? Olay ufku, holografik evrenler ve gizli boyutlar gibi teorilerle, gerçeklik anlayışımızı yeniden şekillendirebilecek bu derin konuya dalıyoruz. Bilim insanları bu sırrı çözebilecek mi? Yorumlarda düşüncelerinizi paylaşın ve daha fazla derinlemesine bilim videosu için kanalımıza abone olun! #KaraDelik #BilgiParadoksu #KuantumFiziği #UzaySırları #DeepTechTR #Evren #Bilim #Shorts [Videoyu beğenmeyi ve arkadaşlarınızla paylaşmayı unutmayın!]` + }, + referenceUrl: null, + sourceType: 'X_TWEET', + sourceTweetData: { + text: '🕳️ Evren Hakkında Bildiklerimizi Alt Üst Edebilecek Kara Delik Sırrı…\n' + + '\n' + + 'Uzayda, yerçekiminin o kadar güçlü olduğu, ışığın bile kaçamadığı bir yer hayal edin. Bunlar kara delikler, evrenin en büyük gizemleri. Ama bilim insanlarının takıntılı olduğu bir nokta var: Bir kara delik tarafından yutulan tüm bilgilere ne oluyor? Fiziğe göre, bilgi öylece yok olamaz. Yine de, kara delikler her şeyi siliyor gibi görünüyor.\n' + + '\n' + + 'Bu bilmeceye Kara Delik Bilgi Paradoksu deniyor ve gerçekliğin temellerini sarsıyor. Bilgi yok olursa, kuantum fiziğinin yasaları çöker. Eğer bir şekilde hayatta kalırsa, bu kara deliklerin kozmik çöp kutularından ziyade kozmik kasalar gibi olduğu anlamına gelebilir.\n' + + '\n' + + 'Bazı bilim insanları cevabın kara deliğin kenarında, olay ufku adı verilen gizemli ince bir sınırda yattığını, burada gerçekliğin kendisinin yeniden yazılabileceğini öne sürüyor. Diğerleri ise holografik evrenler veya gizli boyutlar gibi akıl almaz fikirlere işaret ediyor.\n' + + '\n' + + ' Her kara delik, zaman, uzay ve gerçekliğin kendisi hakkında bildiğimizi sandığımız her şeye meydan okuyan sırlar saklıyor olabilir. Soru şu... çok geç olmadan onları ortaya çıkarabilecek miyiz?\n' + + '\n' + + 'Merak mı ediyorsunuz? Yalnız değilsiniz. Evren sırlarını fısıldıyor... dinliyor musunuz?', + media: [ + { + url: 'https://pbs.twimg.com/media/HDDs5eEWIAAULoL.jpg?name=orig', + type: 'photo', + width: 1366, + height: 2048 + } + ], + metrics: { + likes: 20, + views: 1401, + replies: 2, + retweets: 3, + engagementRate: 1.78 + }, + tweetId: '2031383916846665832', + isThread: false, + tweetUrl: 'https://x.com/DeepTechTR/status/2031383916846665832', + authorName: 'DeepTechTR 🇹🇷', + viralScore: 15, + contentType: 'tweet', + threadCount: 1, + authorAvatar: 'https://pbs.twimg.com/profile_images/2021621961269575680/VzrieQcL_200x200.jpg', + authorUsername: 'DeepTechTR' + }, + status: 'PENDING', + progress: 0, + errorMessage: null, + finalVideoUrl: null, + thumbnailUrl: null, + creditsUsed: 0, + viewCount: 0, + isTemplate: false, + templateId: null, + userId: '4405b182-3145-409e-9b1a-300ff5a8f746', + createdAt: 2026-04-05T14:38:29.145Z, + updatedAt: 2026-04-05T14:39:48.247Z, + completedAt: null, + deletedAt: null + }, + { + id: 'e1d8b5b7-7d92-4bf0-b26a-1589048bec51', + title: 'Kara deliklerin gizemi', + description: null, + prompt: 'Kara deliklerin gizemi', + scriptJson: { + seo: { + title: 'Kara Delikler: Evrenin En Büyük Sırrı Ne?', + hashtags: [ + 'KaraDelikler', + 'Uzay', + 'Bilim', + 'Evren', + 'Kozmos', + 'Gizem', + 'Astrofizik', + 'Shorts' + ], + keywords: [ + 'kara delik', + 'uzay', + 'kütleçekimi', + 'zaman bükülmesi', + 'olay ufku', + 'evren', + 'astrofizik', + 'gizem', + 'bilim', + 'yıldız', + 'galaksi', + 'solucan deliği' + ], + description: 'Kara deliklerin gizemini keşfedin! Uzayın derinliklerindeki bu kozmik canavarların kütleçekimi, zamanı ve ışığı nasıl büktüğünü öğrenin. Olay ufku ve ötesindeki bilinmezlikleri merak edenler için.', + schemaMarkup: { + name: 'Kara Delikler: Evrenin En Büyük Sırrı Ne?', + '@type': 'VideoObject', + duration: 'PT52S', + description: 'Kara deliklerin gizemini keşfedin! Uzayın derinliklerindeki bu kozmik canavarların kütleçekimi, zamanı ve ışığı nasıl büktüğünü öğrenin. Olay ufku ve ötesindeki bilinmezlikleri merak edenler için.' + } + }, + scenes: [ + { + order: 1, + title: 'Kara Deliğe Düşmek', + subtitleText: 'Kara deliğe düşseniz ne olur?', + visualPrompt: 'An extreme wide, ethereal shot of a massive, swirling black hole at the center of a galaxy, with distant stars and nebulae shimmering. The camera slowly orbits the event horizon, revealing its ominous presence.', + narrationText: 'Bir kara deliğin içine düşseniz ne olurdu sanıyorsunuz? Zaman sizin için durur muydu?', + transitionType: 'CUT', + durationSeconds: 3, + ambientSoundPrompt: 'Deep, resonant cosmic hum with subtle distant star twinkle sounds' + }, + { + order: 2, + title: 'Kütleçekiminin Gücü', + subtitleText: 'Işık bile kaçamaz.', + visualPrompt: "A close-up, dynamic shot of a brilliant accretion disk swirling around a black hole, intensely illuminated with fiery orange and red gases. The camera slowly pushes in towards the distorted light around the black hole's edge, highlighting the extreme gravity.", + narrationText: 'Aslında, bu evrenin en büyük sırlarından biri. Kara deliklerin kütleçekimi o kadar güçlü ki, ışık bile kaçamaz. Hayal edin!', + transitionType: 'DISSOLVE', + durationSeconds: 10, + ambientSoundPrompt: 'Intense, sizzling plasma sounds from the accretion disk, deep space drones' + }, + { + order: 3, + title: 'Tek Yön Bilet', + subtitleText: 'Zaman yavaşlar.', + visualPrompt: 'A POV shot, smooth push-in through a shimmering, distorted space-time fabric, as if approaching an invisible barrier. Distant stars stretch and blur into streaks of light, emphasizing the relativistic effects near the event horizon.', + narrationText: 'Olay ufkuna yaklaştıkça, zaman her an daha da yavaşlar. İçeri giren hiçbir madde ya da bilgi geri dönemez. Yani, oraya bir kez girdiğinizde, bu tek yön bir bilet.', + transitionType: 'ZOOM_IN', + durationSeconds: 12, + ambientSoundPrompt: 'Warping and stretching sound effects, a subtle time distortion hum' + }, + { + order: 4, + title: 'Bilinmeyene Yolculuk', + subtitleText: 'Ne oluyor sonra? Bilmiyoruz.', + visualPrompt: 'A surreal, abstract depiction of the singularity: vibrant, shifting colors and impossible geometric forms swirling in a deep, dark void. The camera slowly rotates, creating a sense of disorientation and profound mystery.', + narrationText: 'Peki, içeri girdikten sonra tam olarak ne olduğunu biliyor muyuz? Hayır, bilmiyoruz. Bildiğimiz fizik yasaları orada bildiğimiz gibi kesinlikle işlemiyor.', + transitionType: 'FADE', + durationSeconds: 10, + ambientSoundPrompt: 'Eerie, resonant whispers and deep, abstract cosmic tones' + }, + { + order: 5, + title: 'Başka Evrenlere Açılan Kapı?', + subtitleText: 'Başka evrenlere kapı mı?', + visualPrompt: 'A visually stunning, theoretical depiction of a stable wormhole, a luminous tunnel connecting two distinct cosmic regions. The camera glides through the shimmering opening, revealing distant, distinct galaxies on either side.', + narrationText: 'Bazı bilim insanları kara deliklerin, başka evrenlere açılan kapılar olabileceğini düşünüyor. Ya da belki de evrenin uzak köşelerine ulaşmanın, hatta zaman yolculuğunun anahtarıdır? Kim bilir?', + transitionType: 'DISSOLVE', + durationSeconds: 12, + ambientSoundPrompt: 'Swirling, ethereal whooshing sounds, shimmering light effects' + }, + { + order: 6, + title: 'Evrenin En Büyük Bulmacası', + subtitleText: 'Büyük bulmaca. Çözmeye uzağız.', + visualPrompt: 'An extreme wide aerial drone shot, slowly pulling back to reveal a vast, intricate galaxy, with a tiny, almost imperceptible black hole at its core. The golden hour lighting casts long, soft shadows, emphasizing the immense scale and the enduring mystery of the cosmos.', + narrationText: 'Kara delikler, evrenin en büyüleyici ve en büyük bulmacası. Ve biz insanlık olarak, onu çözmeye henüz çok uzağız.', + transitionType: 'FADE', + durationSeconds: 5, + ambientSoundPrompt: 'Subtle, grand orchestral swell, distant galactic hum' + } + ], + metadata: { + title: 'Kara Delikler: Evrenin En Büyük Sırrı', + hashtags: [ + 'KaraDelikler', + 'Uzay', + 'Bilim', + 'Evren', + 'Kozmos', + 'Gizem', + 'Astrofizik', + 'Shorts' + ], + language: 'tr', + description: 'Kara deliklerin gizemini keşfedin! Uzayın derinliklerindeki bu kozmik canavarların kütleçekimi, zamanı ve ışığı nasıl büktüğünü öğrenin. Olay ufku ve ötesindeki bilinmezlikleri merak edenler için.', + totalDurationSeconds: 52 + }, + musicStyle: 'cinematic-orchestral-sci-fi', + voiceStyle: 'Male, mid-30s, authoritative yet curious tone, with a measured and slightly dramatic pacing. Clean audio with a subtle, very light reverb for a grand, cosmic feel.', + musicPrompt: 'Cinematic orchestral science fiction trailer music, 100 BPM, A minor key, featuring soaring strings, deep brass, powerful percussion, and a subtle ethereal choir. The mood is mysterious and grand, starting calm, building to an epic climax, then resolving with a sense of wonder.', + socialContent: { + twitterText: 'Kara deliğe düşsen ne olurdu? Zaman durur muydu? 🤯 Işık bile kaçamazken, içerde ne olduğunu bilmiyoruz. Evrenin en büyük bulmacası! #KaraDelikler #Uzay', + youtubeTitle: 'Kara Delikler: Evrenin En Büyük Sırrı Ne?', + tiktokCaption: 'Kara deliğe düşsen ne olurdu? 🤯 Işık bile kaçamazken, zaman sana nasıl davranırdı? Evrenin en büyük sırrına kısa bir bakış! #karadelik #uzay #bilim #gizem #shorts', + instagramCaption: 'Evrenin en büyüleyici ve gizemli varlıkları: Kara delikler! ✨ İçine düşsen zaman senin için durur muydu? Kütleçekimi, olay ufku ve ötesindeki bilinmezlikler... Bilim hala bu soruların peşinde. Sence kara delikler ne saklıyor? 🤔 #KaraDelikler #UzayBilimi #Astrofizik #EvreninSırrı #Kozmos', + youtubeDescription: 'Kara deliklerin akıl almaz dünyasına hoş geldiniz! Bu Shorts videosunda, evrenin en gizemli nesnelerinden biri olan kara deliklerin içine düşerseniz ne olacağını keşfediyoruz. Kütleçekiminin ışığı bile nasıl büktüğünü, olay ufkunun sırlarını ve zamanın bu kozmik canavarların yakınında nasıl davrandığını anlıyoruz. Bilim insanları hala kara deliklerin derinliklerinde ne olduğunu çözmeye çalışıyor. Acaba başka evrenlere açılan kapılar mı, yoksa zaman yolculuğunun anahtarı mı? Bu büyüleyici astrofizik gizemini bizimle birlikte keşfedin ve evrenin sınırlarını zorlayan bu sorulara yanıt arayın. Yorumlarda düşüncelerinizi paylaşın ve kanalımıza abone olmayı unutmayın! #KaraDelikler #Uzay #Bilim #Evren #Kozmos #Astrofizik #Shorts' + }, + musicTechnical: { + bpm: 100, + key: 'A minor', + instruments: [ + 'strings', + 'brass', + 'percussion', + 'synthesizer pads', + 'ethereal choir' + ], + emotionalArc: 'low-to-high-to-wonder' + }, + ambientSoundPrompts: [ + 'Deep space hum with distant cosmic wind', + 'Subtle warp effects and light distortions', + 'Mysterious, low-frequency drones with a sense of awe' + ] + }, + scriptVersion: 1, + language: 'tr', + aspectRatio: 'PORTRAIT_9_16', + videoStyle: 'CINEMATIC', + targetDuration: 60, + seoKeywords: [], + seoTitle: 'Kara Delikler: Evrenin En Büyük Sırrı Ne?', + seoDescription: 'Kara deliklerin gizemini keşfedin! Uzayın derinliklerindeki bu kozmik canavarların kütleçekimi, zamanı ve ışığı nasıl büktüğünü öğrenin. Olay ufku ve ötesindeki bilinmezlikleri merak edenler için.', + seoSchemaJson: { + name: 'Kara Delikler: Evrenin En Büyük Sırrı Ne?', + '@type': 'VideoObject', + duration: 'PT52S', + description: 'Kara deliklerin gizemini keşfedin! Uzayın derinliklerindeki bu kozmik canavarların kütleçekimi, zamanı ve ışığı nasıl büktüğünü öğrenin. Olay ufku ve ötesindeki bilinmezlikleri merak edenler için.' + }, + socialContent: { + twitterText: 'Kara deliğe düşsen ne olurdu? Zaman durur muydu? 🤯 Işık bile kaçamazken, içerde ne olduğunu bilmiyoruz. Evrenin en büyük bulmacası! #KaraDelikler #Uzay', + youtubeTitle: 'Kara Delikler: Evrenin En Büyük Sırrı Ne?', + tiktokCaption: 'Kara deliğe düşsen ne olurdu? 🤯 Işık bile kaçamazken, zaman sana nasıl davranırdı? Evrenin en büyük sırrına kısa bir bakış! #karadelik #uzay #bilim #gizem #shorts', + instagramCaption: 'Evrenin en büyüleyici ve gizemli varlıkları: Kara delikler! ✨ İçine düşsen zaman senin için durur muydu? Kütleçekimi, olay ufku ve ötesindeki bilinmezlikler... Bilim hala bu soruların peşinde. Sence kara delikler ne saklıyor? 🤔 #KaraDelikler #UzayBilimi #Astrofizik #EvreninSırrı #Kozmos', + youtubeDescription: 'Kara deliklerin akıl almaz dünyasına hoş geldiniz! Bu Shorts videosunda, evrenin en gizemli nesnelerinden biri olan kara deliklerin içine düşerseniz ne olacağını keşfediyoruz. Kütleçekiminin ışığı bile nasıl büktüğünü, olay ufkunun sırlarını ve zamanın bu kozmik canavarların yakınında nasıl davrandığını anlıyoruz. Bilim insanları hala kara deliklerin derinliklerinde ne olduğunu çözmeye çalışıyor. Acaba başka evrenlere açılan kapılar mı, yoksa zaman yolculuğunun anahtarı mı? Bu büyüleyici astrofizik gizemini bizimle birlikte keşfedin ve evrenin sınırlarını zorlayan bu sorulara yanıt arayın. Yorumlarda düşüncelerinizi paylaşın ve kanalımıza abone olmayı unutmayın! #KaraDelikler #Uzay #Bilim #Evren #Kozmos #Astrofizik #Shorts' + }, + referenceUrl: null, + sourceType: 'MANUAL', + sourceTweetData: null, + status: 'PENDING', + progress: 0, + errorMessage: null, + finalVideoUrl: null, + thumbnailUrl: null, + creditsUsed: 0, + viewCount: 0, + isTemplate: false, + templateId: null, + userId: '4405b182-3145-409e-9b1a-300ff5a8f746', + createdAt: 2026-04-05T14:31:02.784Z, + updatedAt: 2026-04-05T14:33:05.444Z, + completedAt: null, + deletedAt: null + } +] diff --git a/test-tweet.js b/test-tweet.js new file mode 100644 index 0000000..7619169 --- /dev/null +++ b/test-tweet.js @@ -0,0 +1,13 @@ +const { PrismaClient } = require('@prisma/client'); +const prisma = new PrismaClient(); + +async function test() { + const projects = await prisma.project.findMany({ + orderBy: { createdAt: 'desc' }, + take: 5 + }); + console.dir(projects, { depth: null }); +} +test() + .catch(console.error) + .finally(() => prisma.$disconnect()); diff --git a/tweet_res.json b/tweet_res.json new file mode 100644 index 0000000..ff558bf --- /dev/null +++ b/tweet_res.json @@ -0,0 +1 @@ +{"success":false,"status":400,"message":"Tweet çekilemedi (3 deneme): FXTwitter HTTP 404: Not Found","data":null,"errors":[],"stack":"BadRequestException: Tweet çekilemedi (3 deneme): FXTwitter HTTP 404: Not Found\n at XTwitterService.fetchWithRetry (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/x-twitter/x-twitter.service.ts:364:11)\n at process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n at async XTwitterService.fetchTweet (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/x-twitter/x-twitter.service.ts:63:22)\n at async XTwitterService.previewTweet (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/x-twitter/x-twitter.service.ts:91:19)\n at async ProjectsService.createFromTweet (/Users/haruncan/Documents/GitHub/ContentGenerator/ContentGen_BE/src/modules/projects/projects.service.ts:352:21)"} \ No newline at end of file