diff --git a/app/Helpers/FirstParty/AI/CloudflareAI.php b/app/Helpers/FirstParty/AI/CloudflareAI.php index b4de36d..474ea2d 100644 --- a/app/Helpers/FirstParty/AI/CloudflareAI.php +++ b/app/Helpers/FirstParty/AI/CloudflareAI.php @@ -53,7 +53,7 @@ public static function getVectorEmbeddingBgeSmall($embedding_query) KeywordEmbedding::create([ 'keyword' => $embedding_query, - 'embedding' => $embedding + 'embedding' => $embedding, ]); break; diff --git a/app/Helpers/FirstParty/AI/OpenAI.php b/app/Helpers/FirstParty/AI/OpenAI.php index bef53bc..23964f0 100644 --- a/app/Helpers/FirstParty/AI/OpenAI.php +++ b/app/Helpers/FirstParty/AI/OpenAI.php @@ -12,7 +12,7 @@ public static function getMemeKeywords(string $name, string $description) $response = Http::withHeaders([ 'Content-Type' => 'application/json', - 'Authorization' => 'Bearer ' . $apiKey, + 'Authorization' => 'Bearer '.$apiKey, ])->post('https://api.openai.com/v1/responses', [ 'model' => 'gpt-4.1-nano', 'input' => [ @@ -64,7 +64,7 @@ public static function getSingleMemeGenerator($user_prompt) $response = Http::withHeaders([ 'Content-Type' => 'application/json', - 'Authorization' => 'Bearer ' . env('OPENAI_API_KEY'), + 'Authorization' => 'Bearer '.env('OPENAI_API_KEY'), ]) ->post('https://api.openai.com/v1/responses', [ 'model' => 'gpt-4.1-nano', @@ -102,7 +102,7 @@ public static function getSingleMemeGenerator($user_prompt) ], 'primary_keyword_type' => [ 'type' => 'string', - 'description' => "Primary keyword type, choose only between: (action|emotion|misc)", + 'description' => 'Primary keyword type, choose only between: (action|emotion|misc)', ], 'action_keywords' => [ 'type' => 'array', @@ -168,7 +168,7 @@ public static function getSingleMemeGenerator($user_prompt) return $data; } else { // Handle error - throw new \Exception('API request failed: ' . $response->body()); + throw new \Exception('API request failed: '.$response->body()); } } diff --git a/app/Helpers/FirstParty/Maintenance/KeywordEmbeddingMaintenance.php b/app/Helpers/FirstParty/Maintenance/KeywordEmbeddingMaintenance.php index 482d20c..2630bdc 100644 --- a/app/Helpers/FirstParty/Maintenance/KeywordEmbeddingMaintenance.php +++ b/app/Helpers/FirstParty/Maintenance/KeywordEmbeddingMaintenance.php @@ -8,8 +8,6 @@ use App\Models\MemeMedia; use App\Models\MemeMediaEmbedding; use Exception; -use Illuminate\Contracts\Filesystem\Cloud; -use PhpParser\Lexer\TokenEmulator\KeywordEmulator; class KeywordEmbeddingMaintenance { @@ -24,7 +22,7 @@ public static function populateCategoryEmbeddings() foreach ($categories as $category) { - $embedding_query = $category->name . " " . $category->description; + $embedding_query = $category->name.' '.$category->description; $keyword_embedding = KeywordEmbedding::where('keyword', $embedding_query)->first(); @@ -75,7 +73,6 @@ public static function populateMemeMediasKeywordsEmbeddings() dump("{Processing: {$count}/{$max}: {$meme_media->name}"); - // keywords: foreach ($meme_media->keywords as $keyword) { @@ -113,7 +110,6 @@ public static function populateMemeMediasKeywordsEmbeddings() dump("Populating emotion keyword embedding for {$keyword}"); $embedding = self::fetchAndCacheEmbedding($keyword); - if ($embedding) { MemeMediaEmbedding::create([ 'meme_media_id' => $meme_media->id, @@ -140,8 +136,8 @@ public static function populateMemeMediasKeywordsEmbeddings() } dump("βœ“ Successfully processed meme media {$meme_media->id}"); - dump(""); - dump(""); + dump(''); + dump(''); } } @@ -150,7 +146,7 @@ public static function populateMemeMediaEmbeddings() $meme_medias = MemeMedia::whereNotNull('embedding')->get(); foreach ($meme_medias as $meme_media) { - $embedding_query = $meme_media->name . " " . $meme_media->description; + $embedding_query = $meme_media->name.' '.$meme_media->description; $keyword_embedding = KeywordEmbedding::where('keyword', $embedding_query)->first(); @@ -170,7 +166,6 @@ private static function fetchAndCacheEmbedding($keyword) $max_retries = 3; $current_attempt = 0; - while ($embedding === null && $current_attempt < $max_retries) { $current_attempt++; try { diff --git a/app/Helpers/FirstParty/Maintenance/MemeMediaMaintenance.php b/app/Helpers/FirstParty/Maintenance/MemeMediaMaintenance.php index 23f0d80..bbc8a39 100644 --- a/app/Helpers/FirstParty/Maintenance/MemeMediaMaintenance.php +++ b/app/Helpers/FirstParty/Maintenance/MemeMediaMaintenance.php @@ -15,11 +15,11 @@ public static function generateMemesByCategories() Category::where('system_memes_generated_count', '<', 1) ->chunk(10, function ($categories) { foreach ($categories as $category) { - dump('Processing ' . $category->name); + dump('Processing '.$category->name); $meme = MemeGenerator::generateMemeByCategory($category); - if (!is_null($meme)) { + if (! is_null($meme)) { $category->system_memes_generated_count++; $category->save(); } @@ -27,15 +27,13 @@ public static function generateMemesByCategories() }); } - - public static function patchMemeKeywords() { $meme_medias = MemeMedia::whereNull('action_keywords')->get(); foreach ($meme_medias as $key => $meme_media) { - dump('Processing ' . $key + 1 . '/' . $meme_medias->count() . ': ' . $meme_media->name); + dump('Processing '.$key + 1 .'/'.$meme_medias->count().': '.$meme_media->name); $meme_keywords_response = OpenAI::getMemeKeywords($meme_media->name, $meme_media->description); diff --git a/app/Helpers/FirstParty/Meme/MemeGenerator.php b/app/Helpers/FirstParty/Meme/MemeGenerator.php index 18e330b..e63d9f2 100644 --- a/app/Helpers/FirstParty/Meme/MemeGenerator.php +++ b/app/Helpers/FirstParty/Meme/MemeGenerator.php @@ -27,7 +27,6 @@ public static function getSuitableMemeMedia(Meme $meme, $tolerance = 5) { $meme_media = null; - $primary_keyword_type = $meme->primary_keyword_type; if ($primary_keyword_type == 'action') { @@ -40,7 +39,7 @@ public static function getSuitableMemeMedia(Meme $meme, $tolerance = 5) $meme_media = self::getMemeMediaByKeywords($keywords, $tolerance); } - } else if ($primary_keyword_type == 'emotion') { + } elseif ($primary_keyword_type == 'emotion') { $meme_media = self::getMemeMediaByKeywords($meme->emotion_keywords, $tolerance, 'emotion_keywords'); if (is_null($meme_media)) { @@ -48,8 +47,8 @@ public static function getSuitableMemeMedia(Meme $meme, $tolerance = 5) $meme_media = self::getMemeMediaByKeywords($keywords, $tolerance); } - } else if ($primary_keyword_type == 'misc') { - $meme_media = self::getMemeMediaByKeywords($meme->misc_keywords, $tolerance, 'misc_keywords'); + } elseif ($primary_keyword_type == 'misc') { + $meme_media = self::getMemeMediaByKeywords($meme->misc_keywords, $tolerance, 'misc_keywords'); if (is_null($meme_media)) { $keywords = array_merge($meme->action_keywords, $meme->emotion_keywords, $meme->keywords); @@ -97,7 +96,7 @@ public static function generateMemeByCategory(Category $category) $meme->background_media_id = self::generateBackgroundMediaWithRunware($meme_output->background)->id; if ( - //!is_null($meme->meme_media_id) && + // !is_null($meme->meme_media_id) && ! is_null($meme->background_media_id) ) { $meme->status = self::STATUS_COMPLETED; @@ -117,13 +116,13 @@ public static function generateMemeOutputByCategory(Category $category) $random_keyword = Str::lower($category->name); if (! is_null($category->parent_id)) { - $random_keyword = $category->parent->name . ' - ' . $random_keyword; + $random_keyword = $category->parent->name.' - '.$random_keyword; } if (! is_null($category->meme_angles)) { - $random_keyword .= ' - ' . collect($category->meme_angles)->random(); + $random_keyword .= ' - '.collect($category->meme_angles)->random(); } elseif (! is_null($category->keywords)) { - $random_keyword .= ' - ' . collect($category->keywords)->random(); + $random_keyword .= ' - '.collect($category->keywords)->random(); } $prompt = "Write me 1 meme about {$random_keyword}"; @@ -170,7 +169,7 @@ public static function generateMemeOutputByCategory(Category $category) $meme_output = (object) [ 'success' => false, 'attempts' => $attempt, // Optional: track how many attempts were made - 'error' => 'Failed to generate valid meme after ' . $retries . ' attempts', + 'error' => 'Failed to generate valid meme after '.$retries.' attempts', ]; } @@ -214,16 +213,14 @@ public static function getMemeMediaByKeywords(array $keywords, int $tolerance = $meme_embedding = CloudflareAI::getVectorEmbeddingBgeSmall(implode(' ', $keywords)); - $meme_medias = MemeMediaEmbedding::query() - ->when(!is_empty($tag), function ($query) use ($tag) { + ->when(! is_empty($tag), function ($query) use ($tag) { return $query->where('tag', $tag); }) ->nearestNeighbors('embedding', $meme_embedding, Distance::L2) ->take($tolerance) ->get(); - if ($meme_medias->count() > 0) { $meme_media = $meme_medias->random()->meme_media; } diff --git a/app/Models/KeywordEmbedding.php b/app/Models/KeywordEmbedding.php index f9b93a6..f8061b1 100644 --- a/app/Models/KeywordEmbedding.php +++ b/app/Models/KeywordEmbedding.php @@ -19,8 +19,6 @@ * @property string|null $tag * @property Carbon|null $created_at * @property Carbon|null $updated_at - * - * @package App\Models */ class KeywordEmbedding extends Model { @@ -33,6 +31,6 @@ class KeywordEmbedding extends Model protected $fillable = [ 'keyword', 'embedding', - 'tag' + 'tag', ]; } diff --git a/app/Models/MemeMediaEmbedding.php b/app/Models/MemeMediaEmbedding.php index 02b6256..1c06140 100644 --- a/app/Models/MemeMediaEmbedding.php +++ b/app/Models/MemeMediaEmbedding.php @@ -21,10 +21,7 @@ * @property string|null $tag * @property Carbon|null $created_at * @property Carbon|null $updated_at - * * @property MemeMedia $meme_media - * - * @package App\Models */ class MemeMediaEmbedding extends Model { @@ -41,7 +38,7 @@ class MemeMediaEmbedding extends Model 'meme_media_id', 'keyword', 'embedding', - 'tag' + 'tag', ]; public function meme_media() diff --git a/database/migrations/2025_06_20_102737_add_embedding_indexes_to_tables.php b/database/migrations/2025_06_20_102737_add_embedding_indexes_to_tables.php index d493fc3..8327200 100644 --- a/database/migrations/2025_06_20_102737_add_embedding_indexes_to_tables.php +++ b/database/migrations/2025_06_20_102737_add_embedding_indexes_to_tables.php @@ -1,8 +1,6 @@ { }; return ( -
- - - + <> +
+ + + - + - {isBelowMinWidth ? ( -
-
-
-
-
- -
+ {isBelowMinWidth ? ( +
+
+
+
+
+ +
-
-

- {getSetting('genAlphaSlang') - ? 'Not gonna lie, using on a potato screen is giving L vibes. Desktop hits different - that experience is straight fire, bet!' - : 'You seem to be using a potato-sized screen. Please continue with desktop for a more refined experience!'} -

+
+

+ {getSetting('genAlphaSlang') + ? 'Not gonna lie, using on a potato screen is giving L vibes. Desktop hits different - that experience is straight fire, bet!' + : 'You seem to be using a potato-sized screen. Please continue with desktop for a more refined experience!'} +

+
-
- ) : ( - <> - - - - )} -
+ ) : ( + <> + + + + )} +
+ ); }; diff --git a/resources/js/modules/editor/partials/canvas/video-download/video-download-modal.jsx b/resources/js/modules/editor/partials/canvas/video-download/video-download-modal.jsx new file mode 100644 index 0000000..e80e0ac --- /dev/null +++ b/resources/js/modules/editor/partials/canvas/video-download/video-download-modal.jsx @@ -0,0 +1,37 @@ +import { Button } from '@/components/ui/button'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { Spinner } from '@/components/ui/spinner'; +import { Textarea } from '@/components/ui/textarea'; + +const VideoDownloadModal = ({ isOpen, onClose, ffmpegCommand, handleDownloadButton, isExporting, exportProgress, exportStatus }) => { + const debug = true; + return ( + + + + Download Video + {exportStatus || + (exportProgress > 0 && ( + +
+
+ {exportStatus} + {exportProgress}% +
+ +
+
+ ))} +
+ + {debug &&