Update
This commit is contained in:
@@ -108,24 +108,58 @@ public static function generateMemeByCategory(Category $category)
|
||||
return $meme;
|
||||
}
|
||||
|
||||
public static function generateMemeOutputByCategory(Category $category)
|
||||
public static function generateMemeByKeyword($keyword)
|
||||
{
|
||||
$meme_output = self::generateMemeOutputByKeyword($keyword);
|
||||
|
||||
$meme = null;
|
||||
|
||||
if ($meme_output->success) {
|
||||
$meme = Meme::create([
|
||||
'type' => self::TYPE_SINGLE_CAPTION_MEME_BACKGROUND,
|
||||
'prompt' => $meme_output->prompt,
|
||||
'category_id' => null,
|
||||
'caption' => $meme_output->caption,
|
||||
'meme_keywords' => $meme_output->keywords,
|
||||
'background' => $meme_output->background,
|
||||
'keywords' => $meme_output->keywords,
|
||||
'is_system' => true,
|
||||
'status' => self::STATUS_PENDING,
|
||||
'primary_keyword_type' => $meme_output->primary_keyword_type,
|
||||
'action_keywords' => $meme_output->action_keywords,
|
||||
'emotion_keywords' => $meme_output->emotion_keywords,
|
||||
'misc_keywords' => $meme_output->misc_keywords,
|
||||
]);
|
||||
|
||||
$meme->attachTags($meme_output->keywords, 'meme');
|
||||
}
|
||||
|
||||
if (! is_null($meme) && $meme->status == self::STATUS_PENDING) {
|
||||
// populate meme_media_id
|
||||
$meme->meme_media_id = self::getSuitableMemeMedia($meme)->id;
|
||||
$meme->background_media_id = self::generateBackgroundMediaWithRunware($meme_output->background)->id;
|
||||
|
||||
if (
|
||||
// !is_null($meme->meme_media_id) &&
|
||||
! is_null($meme->background_media_id)
|
||||
) {
|
||||
$meme->status = self::STATUS_COMPLETED;
|
||||
}
|
||||
|
||||
$meme->save();
|
||||
}
|
||||
|
||||
return $meme;
|
||||
}
|
||||
|
||||
|
||||
public static function generateMemeOutputByKeyword($keyword, $category = null)
|
||||
{
|
||||
|
||||
$retries = 3;
|
||||
$attempt = 0;
|
||||
|
||||
$random_keyword = Str::lower($category->name);
|
||||
|
||||
if (! is_null($category->parent_id)) {
|
||||
$random_keyword = $category->parent->name.' - '.$random_keyword;
|
||||
}
|
||||
|
||||
if (! is_null($category->meme_angles)) {
|
||||
$random_keyword .= ' - '.collect($category->meme_angles)->random();
|
||||
} elseif (! is_null($category->keywords)) {
|
||||
$random_keyword .= ' - '.collect($category->keywords)->random();
|
||||
}
|
||||
|
||||
$prompt = "Write me 1 meme about {$random_keyword}";
|
||||
$prompt = "Write me 1 meme about {$keyword}";
|
||||
|
||||
// RETRY MECHANISM START
|
||||
do {
|
||||
@@ -169,13 +203,31 @@ 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',
|
||||
];
|
||||
}
|
||||
|
||||
return $meme_output;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (! is_null($category->meme_angles)) {
|
||||
$random_keyword .= ' - ' . collect($category->meme_angles)->random();
|
||||
} elseif (! is_null($category->keywords)) {
|
||||
$random_keyword .= ' - ' . collect($category->keywords)->random();
|
||||
}
|
||||
|
||||
return self::generateMemeOutputByKeyword($random_keyword, $category);
|
||||
}
|
||||
|
||||
public static function generateBackgroundMediaWithRunware($prompt)
|
||||
{
|
||||
$media_width = 1024;
|
||||
|
||||
@@ -2,12 +2,74 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Helpers\FirstParty\Credits\CreditsService;
|
||||
use App\Helpers\FirstParty\Meme\MemeGenerator;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Category;
|
||||
use Auth;
|
||||
|
||||
class UserAIController extends Controller
|
||||
{
|
||||
public function generateMeme(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
|
||||
|
||||
if (!CreditsService::canSpend($user->id, 2)) {
|
||||
return response()->json([
|
||||
'error' => [
|
||||
'message' => 'You do not have enough credits to generate a meme. Please purchase credits from the Store.',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
CreditsService::spend($user->id, 2);
|
||||
|
||||
$meme = MemeGenerator::generateMemeByKeyword($request->prompt);
|
||||
|
||||
$meme_media = MemeGenerator::getSuitableMemeMedia($meme, 2);
|
||||
|
||||
return response()->json([
|
||||
'success' => [
|
||||
'data' => [
|
||||
'generate' => [
|
||||
'info' => $meme,
|
||||
'caption' => $meme->caption,
|
||||
'meme' => $meme_media,
|
||||
'background' => $meme->background_media,
|
||||
],
|
||||
],
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function aiHints()
|
||||
{
|
||||
// TODO: Take 5 Category where meme_angles is not null, and return a random one from the array
|
||||
$categories = Category::whereNotNull('keywords')
|
||||
->inRandomOrder()
|
||||
->take(8)
|
||||
->get();
|
||||
|
||||
if ($categories->isEmpty()) {
|
||||
return response()->json([
|
||||
'success' => [
|
||||
'data' => [
|
||||
'keywords' => []
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
$keywords = $categories->map(function ($category) {
|
||||
return collect($category->keywords)->random();
|
||||
})->toArray();
|
||||
|
||||
return response()->json([
|
||||
'success' => [
|
||||
'data' => [
|
||||
'keywords' => $keywords
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user