Update
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -22,3 +22,7 @@ yarn-error.log
|
||||
/.nova
|
||||
/.vscode
|
||||
/.zed
|
||||
|
||||
# Sitemap files (auto-generated)
|
||||
/public/sitemap.xml
|
||||
/public/sitemap_*.xml
|
||||
|
||||
64
app/Console/Commands/GenerateMemesSitemap.php
Normal file
64
app/Console/Commands/GenerateMemesSitemap.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Services\MemeMediaService;
|
||||
use Illuminate\Console\Command;
|
||||
use Spatie\Sitemap\Sitemap;
|
||||
use Spatie\Sitemap\Tags\Url;
|
||||
|
||||
class GenerateMemesSitemap extends Command
|
||||
{
|
||||
protected $signature = 'sitemap:generate:memes';
|
||||
|
||||
protected $description = 'Generate sitemap for individual meme pages (memes.show)';
|
||||
|
||||
public function __construct(
|
||||
private MemeMediaService $memeMediaService
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$this->info('Starting memes sitemap generation...');
|
||||
|
||||
$sitemap = Sitemap::create();
|
||||
|
||||
// Get the base URL from config
|
||||
$baseUrl = config('app.url');
|
||||
|
||||
// Get all enabled memes
|
||||
$memes = $this->memeMediaService->getAllEnabledMemes();
|
||||
|
||||
$this->info("Found {$memes->count()} enabled memes");
|
||||
|
||||
// Add a progress bar for large datasets
|
||||
$progressBar = $this->output->createProgressBar($memes->count());
|
||||
$progressBar->start();
|
||||
|
||||
// Add each meme to the sitemap
|
||||
foreach ($memes as $meme) {
|
||||
$url = Url::create($baseUrl.'/meme/'.$meme->slug)
|
||||
->setPriority(0.8)
|
||||
->setChangeFrequency(Url::CHANGE_FREQUENCY_MONTHLY)
|
||||
->setLastModificationDate($meme->updated_at);
|
||||
|
||||
$sitemap->add($url);
|
||||
$progressBar->advance();
|
||||
}
|
||||
|
||||
$progressBar->finish();
|
||||
$this->newLine();
|
||||
|
||||
// Save the sitemap
|
||||
$sitemapPath = public_path('sitemap_memes.xml');
|
||||
$sitemap->writeToFile($sitemapPath);
|
||||
|
||||
$this->info('Memes sitemap generated successfully!');
|
||||
$this->info("Sitemap saved to: {$sitemapPath}");
|
||||
$this->info("Total URLs: {$memes->count()}");
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
||||
71
app/Console/Commands/GenerateSitemap.php
Normal file
71
app/Console/Commands/GenerateSitemap.php
Normal file
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Spatie\Sitemap\SitemapIndex;
|
||||
|
||||
class GenerateSitemap extends Command
|
||||
{
|
||||
protected $signature = 'sitemap:generate';
|
||||
|
||||
protected $description = 'Generate main sitemap index that links to all sub-sitemaps';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$this->info('Starting main sitemap generation...');
|
||||
|
||||
$sitemapIndex = SitemapIndex::create();
|
||||
|
||||
// Get the base URL from config
|
||||
$baseUrl = config('app.url');
|
||||
|
||||
// List of sub-sitemaps to include in the main sitemap
|
||||
$subSitemaps = [
|
||||
[
|
||||
'url' => $baseUrl.'/sitemap_static.xml',
|
||||
'lastModified' => $this->getSitemapLastModified('sitemap_static.xml'),
|
||||
],
|
||||
[
|
||||
'url' => $baseUrl.'/sitemap_memes.xml',
|
||||
'lastModified' => $this->getSitemapLastModified('sitemap_memes.xml'),
|
||||
],
|
||||
// Future sitemaps can be added here:
|
||||
// [
|
||||
// 'url' => $baseUrl . '/sitemap_pages.xml',
|
||||
// 'lastModified' => now(),
|
||||
// ],
|
||||
];
|
||||
|
||||
// Add each sub-sitemap to the index
|
||||
foreach ($subSitemaps as $sitemap) {
|
||||
$sitemapIndex->add($sitemap['url'], $sitemap['lastModified']);
|
||||
$this->info("Added sub-sitemap: {$sitemap['url']}");
|
||||
}
|
||||
|
||||
// Save the main sitemap index
|
||||
$sitemapPath = public_path('sitemap.xml');
|
||||
$sitemapIndex->writeToFile($sitemapPath);
|
||||
|
||||
$this->info('Main sitemap index generated successfully!');
|
||||
$this->info("Sitemap saved to: {$sitemapPath}");
|
||||
$this->info('Total sub-sitemaps: '.count($subSitemaps));
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last modification date of a sitemap file
|
||||
*/
|
||||
private function getSitemapLastModified(string $filename): \DateTime
|
||||
{
|
||||
$filepath = public_path($filename);
|
||||
|
||||
if (file_exists($filepath)) {
|
||||
return new \DateTime('@'.filemtime($filepath));
|
||||
}
|
||||
|
||||
// If file doesn't exist, return current time
|
||||
return new \DateTime;
|
||||
}
|
||||
}
|
||||
80
app/Console/Commands/GenerateStaticSitemap.php
Normal file
80
app/Console/Commands/GenerateStaticSitemap.php
Normal file
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Spatie\Sitemap\Sitemap;
|
||||
use Spatie\Sitemap\Tags\Url;
|
||||
|
||||
class GenerateStaticSitemap extends Command
|
||||
{
|
||||
protected $signature = 'sitemap:generate:static';
|
||||
|
||||
protected $description = 'Generate sitemap for static pages (home, privacy, terms, dmca, meme library)';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$this->info('Starting static sitemap generation...');
|
||||
|
||||
$sitemap = Sitemap::create();
|
||||
|
||||
// Get the base URL from config
|
||||
$baseUrl = config('app.url');
|
||||
|
||||
// Add static pages
|
||||
$staticPages = [
|
||||
[
|
||||
'url' => $baseUrl,
|
||||
'priority' => 1.0,
|
||||
'changeFrequency' => Url::CHANGE_FREQUENCY_WEEKLY,
|
||||
'lastModificationDate' => now(),
|
||||
],
|
||||
[
|
||||
'url' => $baseUrl.'/meme-library',
|
||||
'priority' => 0.9,
|
||||
'changeFrequency' => Url::CHANGE_FREQUENCY_DAILY,
|
||||
'lastModificationDate' => now(),
|
||||
],
|
||||
[
|
||||
'url' => $baseUrl.'/privacy',
|
||||
'priority' => 0.3,
|
||||
'changeFrequency' => Url::CHANGE_FREQUENCY_YEARLY,
|
||||
'lastModificationDate' => now()->subMonths(6), // Adjust based on when you last updated
|
||||
],
|
||||
[
|
||||
'url' => $baseUrl.'/terms',
|
||||
'priority' => 0.3,
|
||||
'changeFrequency' => Url::CHANGE_FREQUENCY_YEARLY,
|
||||
'lastModificationDate' => now()->subMonths(6), // Adjust based on when you last updated
|
||||
],
|
||||
[
|
||||
'url' => $baseUrl.'/dmca-copyright',
|
||||
'priority' => 0.2,
|
||||
'changeFrequency' => Url::CHANGE_FREQUENCY_YEARLY,
|
||||
'lastModificationDate' => now()->subMonths(6), // Adjust based on when you last updated
|
||||
],
|
||||
];
|
||||
|
||||
// Add each static page to the sitemap
|
||||
foreach ($staticPages as $page) {
|
||||
$url = Url::create($page['url'])
|
||||
->setPriority($page['priority'])
|
||||
->setChangeFrequency($page['changeFrequency'])
|
||||
->setLastModificationDate($page['lastModificationDate']);
|
||||
|
||||
$sitemap->add($url);
|
||||
|
||||
$this->info("Added: {$page['url']}");
|
||||
}
|
||||
|
||||
// Save the sitemap
|
||||
$sitemapPath = public_path('sitemap_static.xml');
|
||||
$sitemap->writeToFile($sitemapPath);
|
||||
|
||||
$this->info('Static sitemap generated successfully!');
|
||||
$this->info("Sitemap saved to: {$sitemapPath}");
|
||||
$this->info('Total URLs: '.count($staticPages));
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
||||
51
app/Console/Commands/PopulateMemeMediaSlugs.php
Normal file
51
app/Console/Commands/PopulateMemeMediaSlugs.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\MemeMedia;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class PopulateMemeMediaSlugs extends Command
|
||||
{
|
||||
protected $signature = 'memes:populate-slugs';
|
||||
|
||||
protected $description = 'Populate slug field for existing MemeMedia records';
|
||||
|
||||
public function handle()
|
||||
{
|
||||
$this->info('Starting to populate MemeMedia slugs...');
|
||||
|
||||
$memes = MemeMedia::whereNull('slug')->get();
|
||||
|
||||
if ($memes->isEmpty()) {
|
||||
$this->info('No memes found without slugs.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->info("Found {$memes->count()} memes without slugs.");
|
||||
|
||||
$bar = $this->output->createProgressBar($memes->count());
|
||||
$bar->start();
|
||||
|
||||
foreach ($memes as $meme) {
|
||||
$baseSlug = Str::slug($meme->name);
|
||||
$slug = $baseSlug;
|
||||
$counter = 1;
|
||||
|
||||
// Ensure slug is unique
|
||||
while (MemeMedia::where('slug', $slug)->exists()) {
|
||||
$slug = $baseSlug.'-'.$counter;
|
||||
$counter++;
|
||||
}
|
||||
|
||||
$meme->update(['slug' => $slug]);
|
||||
$bar->advance();
|
||||
}
|
||||
|
||||
$bar->finish();
|
||||
$this->newLine();
|
||||
$this->info('Successfully populated all MemeMedia slugs!');
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
use App\Models\BackgroundMedia;
|
||||
use App\Models\MemeMedia;
|
||||
use App\Services\MemeMediaService;
|
||||
use Artesaos\SEOTools\Facades\JsonLd;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
@@ -11,6 +12,10 @@
|
||||
|
||||
class FrontHomeController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private MemeMediaService $memeMediaService
|
||||
) {}
|
||||
|
||||
public function index()
|
||||
{
|
||||
if (App::environment('production') && env('COMING_SOON_ENABLED', true)) {
|
||||
@@ -28,12 +33,16 @@ public function index()
|
||||
// Get FAQ data
|
||||
$faqData = $this->getFaqData();
|
||||
|
||||
// Get popular keywords for search suggestions
|
||||
$popularKeywords = $this->memeMediaService->getPopularKeywords(10);
|
||||
|
||||
// Add FAQ JSON-LD structured data
|
||||
$this->addFaqJsonLd($faqData);
|
||||
|
||||
return Inertia::render('home/home', [
|
||||
'stats' => $stats,
|
||||
'faqData' => $faqData,
|
||||
'popularKeywords' => $popularKeywords,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
333
app/Http/Controllers/FrontMemeController.php
Normal file
333
app/Http/Controllers/FrontMemeController.php
Normal file
@@ -0,0 +1,333 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Services\MemeMediaService;
|
||||
use Artesaos\SEOTools\Facades\OpenGraph;
|
||||
use Artesaos\SEOTools\Facades\SEOMeta;
|
||||
use Artesaos\SEOTools\Facades\TwitterCard;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response as HttpResponse;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
use Intervention\Image\Drivers\Imagick\Driver;
|
||||
use Intervention\Image\ImageManager;
|
||||
|
||||
class FrontMemeController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private MemeMediaService $memeMediaService
|
||||
) {}
|
||||
|
||||
public function index(Request $request): Response
|
||||
{
|
||||
return $this->getMemes($request->input('search'));
|
||||
}
|
||||
|
||||
public function search(string $search): Response
|
||||
{
|
||||
// Convert + back to spaces for search
|
||||
$searchTerm = str_replace('+', ' ', $search);
|
||||
|
||||
return $this->getMemes($searchTerm);
|
||||
}
|
||||
|
||||
private function getMemes(?string $search = null): Response
|
||||
{
|
||||
$memes = $this->memeMediaService->searchMemes($search, 24);
|
||||
|
||||
// Set up SEO meta tags
|
||||
$title = $search ? ucfirst($search).' Memes in MEMEFA.ST' : 'Meme Library - Thousands of Video Meme Templates';
|
||||
|
||||
if ($search) {
|
||||
// Get SEO descriptions from config
|
||||
$descriptions = config('platform.seo_descriptions.search_descriptions', []);
|
||||
|
||||
// Use deterministic selection based on search term hash
|
||||
$searchHash = crc32($search);
|
||||
$descriptionIndex = abs($searchHash) % count($descriptions);
|
||||
$descriptionTemplate = $descriptions[$descriptionIndex];
|
||||
|
||||
// Replace keyword placeholder
|
||||
$description = str_replace('__KEYWORD__', $search, $descriptionTemplate);
|
||||
} else {
|
||||
$description = 'Browse thousands of video meme templates ready for TikTok, Instagram Reels, Threads and YouTube Shorts. Create viral content in minutes with our meme editor.';
|
||||
}
|
||||
|
||||
SEOMeta::setTitle($title, false);
|
||||
SEOMeta::setDescription($description);
|
||||
SEOMeta::setCanonical(request()->url());
|
||||
|
||||
// Add pagination rel links
|
||||
if ($memes->previousPageUrl()) {
|
||||
SEOMeta::addMeta('link:prev', $memes->previousPageUrl(), 'rel');
|
||||
}
|
||||
if ($memes->nextPageUrl()) {
|
||||
SEOMeta::addMeta('link:next', $memes->nextPageUrl(), 'rel');
|
||||
}
|
||||
|
||||
// OpenGraph tags
|
||||
OpenGraph::setTitle($title);
|
||||
OpenGraph::setDescription($description);
|
||||
OpenGraph::setUrl(request()->url());
|
||||
OpenGraph::addProperty('type', 'website');
|
||||
|
||||
// Twitter Card
|
||||
TwitterCard::setTitle($title);
|
||||
TwitterCard::setDescription($description);
|
||||
TwitterCard::setType('summary_large_image');
|
||||
|
||||
// Get available types for filter
|
||||
$types = $this->memeMediaService->getAvailableTypes();
|
||||
|
||||
// Get popular keywords for filter
|
||||
$popularKeywords = $this->memeMediaService->getPopularKeywords(20);
|
||||
|
||||
return Inertia::render('memes/index', [
|
||||
'memes' => $memes,
|
||||
'types' => $types,
|
||||
'popularKeywords' => $popularKeywords,
|
||||
'filters' => [
|
||||
'search' => $search,
|
||||
],
|
||||
'dynamicDescription' => $search ? $description : null,
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(string $slug): Response
|
||||
{
|
||||
$meme = $this->memeMediaService->findBySlug($slug);
|
||||
|
||||
// Get related memes based on similar keywords
|
||||
$relatedMemes = $this->memeMediaService->getRelatedMemes($meme, 6);
|
||||
|
||||
// Set up SEO meta tags for individual meme page
|
||||
$title = "{$meme->name} - Make Video Memes with MEMEFA.ST";
|
||||
$description = $meme->description
|
||||
? "This meme is about: {$meme->description}."
|
||||
: "Create {$meme->name} video memes with our online editor. Perfect for TikTok, Instagram Reels, and YouTube Shorts.";
|
||||
|
||||
SEOMeta::setTitle($title, false);
|
||||
SEOMeta::setDescription($description);
|
||||
SEOMeta::setCanonical(request()->url());
|
||||
SEOMeta::addKeyword(collect([$meme->keywords, $meme->action_keywords, $meme->emotion_keywords, $meme->misc_keywords])->flatten()->filter()->implode(', '));
|
||||
|
||||
// OpenGraph tags
|
||||
OpenGraph::setTitle($title);
|
||||
OpenGraph::setDescription($description);
|
||||
OpenGraph::setUrl(request()->url());
|
||||
OpenGraph::addProperty('type', 'video.other');
|
||||
OpenGraph::addImage(route('memes.og', $meme->ids));
|
||||
|
||||
// Twitter Card
|
||||
TwitterCard::setTitle($title);
|
||||
TwitterCard::setDescription($description);
|
||||
TwitterCard::setType('summary_large_image');
|
||||
TwitterCard::setImage(route('memes.og', $meme->ids));
|
||||
|
||||
return Inertia::render('memes/show', [
|
||||
'meme' => $meme,
|
||||
'relatedMemes' => $relatedMemes,
|
||||
]);
|
||||
}
|
||||
|
||||
public function generateOG(string $ids): HttpResponse
|
||||
{
|
||||
// Get the meme media using the service
|
||||
$meme = $this->memeMediaService->findByHashIds($ids);
|
||||
|
||||
// Load the template image
|
||||
$templatePath = public_path('memefast-og-template.jpg');
|
||||
|
||||
if (! file_exists($templatePath)) {
|
||||
abort(404, 'Template image not found');
|
||||
}
|
||||
|
||||
// Create ImageManager with Imagick driver
|
||||
$manager = new ImageManager(new Driver);
|
||||
|
||||
// Load the template image
|
||||
$image = $manager->read($templatePath);
|
||||
|
||||
// Ensure RGB colorspace for proper color rendering
|
||||
$imagick = $image->core()->native();
|
||||
$imagick->setColorspace(\Imagick::COLORSPACE_SRGB);
|
||||
|
||||
// Load the meme image from URL
|
||||
if ($meme->webp_url) {
|
||||
try {
|
||||
// Use cURL to get the image content with proper headers
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $meme->webp_url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||||
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MemeFast OG Generator)');
|
||||
|
||||
$imageContent = curl_exec($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($imageContent !== false && $httpCode === 200) {
|
||||
$memeImage = $manager->read($imageContent);
|
||||
|
||||
// Image positioning variables
|
||||
$imageX = 0; // Horizontal offset
|
||||
$imageY = 100; // Vertical offset
|
||||
|
||||
// Resize meme image to 1.5x the template height while maintaining aspect ratio
|
||||
$memeImage = $memeImage->scale(height: 1350);
|
||||
|
||||
// Place the meme image vertically centered, horizontally right-justified
|
||||
$image->place($memeImage, 'center-right', $imageX, $imageY);
|
||||
} else {
|
||||
$image->text('HTTP Error: '.$httpCode, 200, 200, function ($font) {
|
||||
$font->size(20);
|
||||
$font->color('#ff0000');
|
||||
$font->align('center');
|
||||
});
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// If meme image fails to load, add debug text
|
||||
$image->text('Image failed to load: '.$e->getMessage(), 200, 200, function ($font) {
|
||||
$font->size(20);
|
||||
$font->color('#ff0000');
|
||||
$font->align('center');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Add the meme name as text with proper kerning and line wrapping
|
||||
if ($meme->name) {
|
||||
$fontPath = resource_path('fonts/Geist/Geist-Bold.ttf');
|
||||
|
||||
// Fallback to built-in font if TTF not found
|
||||
if (file_exists($fontPath)) {
|
||||
// Use native Imagick for text kerning with line wrapping
|
||||
$imagick = $image->core()->native(); // Get the native Imagick object
|
||||
|
||||
// First draw the green outline
|
||||
$drawOutline = new \ImagickDraw;
|
||||
$drawOutline->setFillColor('#00FF00');
|
||||
$drawOutline->setFont($fontPath);
|
||||
$drawOutline->setFontSize(70);
|
||||
$drawOutline->setTextAlignment(\Imagick::ALIGN_LEFT);
|
||||
$drawOutline->setStrokeColor('#00FF00');
|
||||
$drawOutline->setStrokeWidth(20); // Thicker stroke for outline effect
|
||||
|
||||
// Then draw the black text on top
|
||||
$draw = new \ImagickDraw;
|
||||
$draw->setFillColor('#000000');
|
||||
$draw->setFont($fontPath);
|
||||
$draw->setFontSize(70);
|
||||
// $draw->setTextKerning(-4); // Negative for tighter kerning
|
||||
$draw->setTextAlignment(\Imagick::ALIGN_LEFT);
|
||||
|
||||
// Text wrapping - 70% of canvas width (1600 * 0.7 = 1120px)
|
||||
$maxWidth = 1120;
|
||||
$text = 'Make meme videos instantly with '.$meme->name.' meme with';
|
||||
|
||||
// Split text into words
|
||||
$words = explode(' ', $text);
|
||||
$lines = [];
|
||||
$currentLine = '';
|
||||
|
||||
foreach ($words as $word) {
|
||||
$testLine = $currentLine.($currentLine ? ' ' : '').$word;
|
||||
|
||||
// Get text metrics for the test line
|
||||
$metrics = $imagick->queryFontMetrics($draw, $testLine);
|
||||
|
||||
if ($metrics['textWidth'] > $maxWidth && $currentLine !== '') {
|
||||
// Line is too long, save current line and start new one
|
||||
$lines[] = $currentLine;
|
||||
$currentLine = $word;
|
||||
} else {
|
||||
$currentLine = $testLine;
|
||||
}
|
||||
}
|
||||
|
||||
// Add the last line
|
||||
if ($currentLine) {
|
||||
$lines[] = $currentLine;
|
||||
}
|
||||
|
||||
$lines[] .= 'MEMEFAST';
|
||||
|
||||
// Text positioning variables
|
||||
$textX = 100; // Horizontal position
|
||||
$textY = 320; // Base vertical position
|
||||
|
||||
// Calculate line height and starting Y position
|
||||
$lineHeight = 75; // Tighter line spacing
|
||||
$totalHeight = count($lines) * $lineHeight;
|
||||
$startY = $textY - ($totalHeight / 2); // Center vertically
|
||||
|
||||
// Draw each line (left-aligned) - first the outline, then the text
|
||||
foreach ($lines as $index => $line) {
|
||||
$y = $startY + ($index * $lineHeight);
|
||||
|
||||
// Check if this is the MEMEFA.ST line
|
||||
if ($line === 'MEMEFAST') {
|
||||
|
||||
$extraSizing = 40;
|
||||
|
||||
// Use Bungee font for MEMEFA.ST
|
||||
$bungeeFontPath = resource_path('fonts/Bungee/Bungee-Regular.ttf');
|
||||
|
||||
if (file_exists($bungeeFontPath)) {
|
||||
// Create separate draw objects for Bungee font
|
||||
$bungeeOutline = new \ImagickDraw;
|
||||
$bungeeOutline->setFillColor('#00FF00');
|
||||
$bungeeOutline->setFont($bungeeFontPath);
|
||||
$bungeeOutline->setFontSize(70);
|
||||
$bungeeOutline->setTextAlignment(\Imagick::ALIGN_LEFT);
|
||||
$bungeeOutline->setStrokeColor('#00FF00');
|
||||
$bungeeOutline->setStrokeWidth(20);
|
||||
|
||||
$bungeeText = new \ImagickDraw;
|
||||
$bungeeText->setFillColor('#000000');
|
||||
$bungeeText->setFont($bungeeFontPath);
|
||||
$bungeeText->setFontSize(70 + $extraSizing);
|
||||
$bungeeText->setTextAlignment(\Imagick::ALIGN_LEFT);
|
||||
|
||||
// Draw with Bungee font
|
||||
$bungeeOutline->annotation($textX, $y + $extraSizing, $line);
|
||||
$bungeeText->annotation($textX, $y + $extraSizing, $line);
|
||||
|
||||
$imagick->drawImage($bungeeOutline);
|
||||
$imagick->drawImage($bungeeText);
|
||||
} else {
|
||||
// Fallback to regular font
|
||||
$drawOutline->annotation($textX, $y + $extraSizing, $line);
|
||||
$draw->annotation($textX, $y + $extraSizing, $line);
|
||||
}
|
||||
} else {
|
||||
// Use regular font for other lines
|
||||
$drawOutline->annotation($textX, $y, $line);
|
||||
$draw->annotation($textX, $y, $line);
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the drawing to the image (only for non-Bungee lines)
|
||||
$imagick->drawImage($drawOutline); // Draw outline first
|
||||
$imagick->drawImage($draw); // Draw text on top
|
||||
} else {
|
||||
$image->text($meme->name, 400, 450, function ($font) {
|
||||
$font->size(80);
|
||||
$font->color('#000000');
|
||||
$font->align('center');
|
||||
$font->valign('middle');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Generate the image and return as response
|
||||
$encodedImage = $image->toJpeg(100);
|
||||
|
||||
return response($encodedImage, 200, [
|
||||
'Content-Type' => 'image/jpeg',
|
||||
'Cache-Control' => 'public, max-age=3600',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Artesaos\SEOTools\Facades\OpenGraph;
|
||||
use Artesaos\SEOTools\Facades\SEOMeta;
|
||||
use Artesaos\SEOTools\Facades\TwitterCard;
|
||||
use Illuminate\Support\Str;
|
||||
use Inertia\Inertia;
|
||||
|
||||
@@ -9,6 +12,25 @@ class FrontPagesController extends Controller
|
||||
{
|
||||
public function privacy()
|
||||
{
|
||||
// Set up SEO meta tags
|
||||
$title = 'Privacy Policy';
|
||||
$description = 'Read our privacy policy to understand how Memefast collects, uses, and protects your personal information when using our video meme creation platform.';
|
||||
|
||||
SEOMeta::setTitle($title);
|
||||
SEOMeta::setDescription($description);
|
||||
SEOMeta::setCanonical(request()->url());
|
||||
|
||||
// OpenGraph tags
|
||||
OpenGraph::setTitle($title);
|
||||
OpenGraph::setDescription($description);
|
||||
OpenGraph::setUrl(request()->url());
|
||||
OpenGraph::addProperty('type', 'website');
|
||||
|
||||
// Twitter Card
|
||||
TwitterCard::setTitle($title);
|
||||
TwitterCard::setDescription($description);
|
||||
TwitterCard::setType('summary');
|
||||
|
||||
$markdownPath = resource_path('markdown/privacy.md');
|
||||
$markdownContent = file_get_contents($markdownPath);
|
||||
|
||||
@@ -26,6 +48,25 @@ public function privacy()
|
||||
|
||||
public function terms()
|
||||
{
|
||||
// Set up SEO meta tags
|
||||
$title = 'Terms & Conditions';
|
||||
$description = 'Review our terms and conditions to understand the rules and guidelines for using Memefast video meme creation platform and services.';
|
||||
|
||||
SEOMeta::setTitle($title);
|
||||
SEOMeta::setDescription($description);
|
||||
SEOMeta::setCanonical(request()->url());
|
||||
|
||||
// OpenGraph tags
|
||||
OpenGraph::setTitle($title);
|
||||
OpenGraph::setDescription($description);
|
||||
OpenGraph::setUrl(request()->url());
|
||||
OpenGraph::addProperty('type', 'website');
|
||||
|
||||
// Twitter Card
|
||||
TwitterCard::setTitle($title);
|
||||
TwitterCard::setDescription($description);
|
||||
TwitterCard::setType('summary');
|
||||
|
||||
$markdownPath = resource_path('markdown/terms.md');
|
||||
$markdownContent = file_get_contents($markdownPath);
|
||||
|
||||
@@ -41,6 +82,42 @@ public function terms()
|
||||
]);
|
||||
}
|
||||
|
||||
public function dmcaCopyright()
|
||||
{
|
||||
// Set up SEO meta tags
|
||||
$title = 'DMCA Copyright Policy';
|
||||
$description = 'MEMEFA.ST DMCA copyright policy and procedures for reporting copyright infringement. Learn how to file DMCA notices and counter-notices.';
|
||||
|
||||
SEOMeta::setTitle($title);
|
||||
SEOMeta::setDescription($description);
|
||||
SEOMeta::setCanonical(request()->url());
|
||||
|
||||
// OpenGraph tags
|
||||
OpenGraph::setTitle($title);
|
||||
OpenGraph::setDescription($description);
|
||||
OpenGraph::setUrl(request()->url());
|
||||
OpenGraph::addProperty('type', 'website');
|
||||
|
||||
// Twitter Card
|
||||
TwitterCard::setTitle($title);
|
||||
TwitterCard::setDescription($description);
|
||||
TwitterCard::setType('summary');
|
||||
|
||||
$markdownPath = resource_path('markdown/dmca-copyright.md');
|
||||
$markdownContent = file_get_contents($markdownPath);
|
||||
|
||||
// Parse markdown to HTML using Laravel's built-in Str::markdown helper
|
||||
$htmlContent = Str::markdown($markdownContent);
|
||||
|
||||
// Style the HTML with Tailwind classes
|
||||
$styledContent = $this->styleHtmlContent($htmlContent);
|
||||
|
||||
return Inertia::render('FrontPages/DmcaCopyright', [
|
||||
'content' => $styledContent,
|
||||
'title' => 'DMCA Copyright Policy',
|
||||
]);
|
||||
}
|
||||
|
||||
private function styleHtmlContent($html)
|
||||
{
|
||||
// Add classes to various HTML elements using string replacement for Tailwind 4
|
||||
|
||||
@@ -53,6 +53,7 @@ class MemeMedia extends Model
|
||||
'sub_type',
|
||||
'original_id',
|
||||
'name',
|
||||
'slug',
|
||||
'description',
|
||||
'keywords',
|
||||
'group',
|
||||
@@ -79,7 +80,7 @@ class MemeMedia extends Model
|
||||
'type',
|
||||
'sub_type',
|
||||
'original_id',
|
||||
'description',
|
||||
// 'description',
|
||||
'mov_uuid',
|
||||
'webm_uuid',
|
||||
'gif_uuid',
|
||||
|
||||
172
app/Services/MemeMediaService.php
Normal file
172
app/Services/MemeMediaService.php
Normal file
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\MemeMedia;
|
||||
use Illuminate\Contracts\Pagination\CursorPaginator;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||
use Illuminate\Support\Collection as SupportCollection;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class MemeMediaService
|
||||
{
|
||||
/**
|
||||
* Search memes with optional query and pagination
|
||||
*/
|
||||
public function searchMemes(?string $search = null, int $perPage = 24): CursorPaginator
|
||||
{
|
||||
$query = $this->buildSearchQuery($search);
|
||||
|
||||
return $query->cursorPaginate($perPage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get popular keywords for filtering
|
||||
*/
|
||||
public function getPopularKeywords(int $limit = 20): SupportCollection
|
||||
{
|
||||
$cacheKey = "popular_keywords_limit_{$limit}";
|
||||
|
||||
return Cache::remember($cacheKey, 60 * 60 * 24, function () use ($limit) {
|
||||
return MemeMedia::where('is_enabled', true)
|
||||
->get()
|
||||
->pluck('keywords')
|
||||
->flatten()
|
||||
->countBy()
|
||||
->sort()
|
||||
->reverse()
|
||||
->take($limit)
|
||||
->keys();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get available meme types for filtering
|
||||
*/
|
||||
public function getAvailableTypes(): SupportCollection
|
||||
{
|
||||
return MemeMedia::where('is_enabled', true)
|
||||
->distinct()
|
||||
->pluck('type')
|
||||
->filter();
|
||||
}
|
||||
|
||||
/**
|
||||
* Find meme by slug
|
||||
*/
|
||||
public function findBySlug(string $slug): MemeMedia
|
||||
{
|
||||
return MemeMedia::where('slug', $slug)
|
||||
->where('is_enabled', true)
|
||||
->firstOrFail();
|
||||
}
|
||||
|
||||
/**
|
||||
* Find meme by hashids
|
||||
*/
|
||||
public function findByHashIds(string $ids): MemeMedia
|
||||
{
|
||||
$memeId = hashids_decode($ids);
|
||||
|
||||
if (! $memeId) {
|
||||
throw new ModelNotFoundException('Meme not found');
|
||||
}
|
||||
|
||||
return MemeMedia::where('id', $memeId)
|
||||
->where('is_enabled', true)
|
||||
->firstOrFail();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get related memes based on keywords
|
||||
*/
|
||||
public function getRelatedMemes(MemeMedia $meme, int $limit = 6): Collection
|
||||
{
|
||||
$relatedMemes = MemeMedia::where('is_enabled', true)
|
||||
->where('id', '!=', $meme->id)
|
||||
->where(function ($query) use ($meme) {
|
||||
if ($meme->keywords) {
|
||||
foreach ($meme->keywords as $keyword) {
|
||||
$query->orWhereJsonContains('keywords', $keyword)
|
||||
->orWhereJsonContains('action_keywords', $keyword)
|
||||
->orWhereJsonContains('emotion_keywords', $keyword)
|
||||
->orWhereJsonContains('misc_keywords', $keyword);
|
||||
}
|
||||
}
|
||||
})
|
||||
->limit($limit)
|
||||
->get();
|
||||
|
||||
// If we have less than the desired limit, fill up with random ones
|
||||
if ($relatedMemes->count() < $limit) {
|
||||
$excludeIds = $relatedMemes->pluck('id')->push($meme->id)->toArray();
|
||||
$needed = $limit - $relatedMemes->count();
|
||||
|
||||
$randomMemes = $this->fillWithRandomMemes($relatedMemes, $limit, $excludeIds);
|
||||
$relatedMemes = $relatedMemes->merge($randomMemes);
|
||||
}
|
||||
|
||||
return $relatedMemes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill collection with random memes up to target count
|
||||
*/
|
||||
public function fillWithRandomMemes(Collection $existing, int $targetCount, array $excludeIds): Collection
|
||||
{
|
||||
$needed = $targetCount - $existing->count();
|
||||
|
||||
if ($needed <= 0) {
|
||||
return collect();
|
||||
}
|
||||
|
||||
return MemeMedia::where('is_enabled', true)
|
||||
->whereNotIn('id', $excludeIds)
|
||||
->inRandomOrder()
|
||||
->limit($needed)
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Build search query with keyword matching
|
||||
*/
|
||||
private function buildSearchQuery(?string $search = null): Builder
|
||||
{
|
||||
$query = $this->getEnabledMemesQuery();
|
||||
|
||||
if ($search) {
|
||||
$query->where(function ($q) use ($search) {
|
||||
$q->where('name', 'ilike', "%{$search}%")
|
||||
->orWhere('description', 'ilike', "%{$search}%")
|
||||
->orWhereJsonContains('keywords', $search)
|
||||
->orWhereJsonContains('action_keywords', $search)
|
||||
->orWhereJsonContains('emotion_keywords', $search)
|
||||
->orWhereJsonContains('misc_keywords', $search);
|
||||
});
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all enabled memes for sitemap generation
|
||||
*/
|
||||
public function getAllEnabledMemes(): Collection
|
||||
{
|
||||
return MemeMedia::where('is_enabled', true)
|
||||
->orderBy('updated_at', 'desc')
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get base query for enabled memes
|
||||
*/
|
||||
private function getEnabledMemesQuery(): Builder
|
||||
{
|
||||
return MemeMedia::query()
|
||||
->where('is_enabled', true)
|
||||
->orderBy('id', 'desc');
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,7 @@
|
||||
"php": "^8.2",
|
||||
"artesaos/seotools": "^1.3",
|
||||
"inertiajs/inertia-laravel": "^2.0",
|
||||
"intervention/image": "^3.11",
|
||||
"jenssegers/imagehash": "^0.10.0",
|
||||
"kalnoy/nestedset": "^6.0",
|
||||
"laravel/cashier": "^15.7",
|
||||
@@ -25,6 +26,7 @@
|
||||
"pbmedia/laravel-ffmpeg": "^8.7",
|
||||
"pgvector/pgvector": "^0.2.2",
|
||||
"spatie/laravel-responsecache": "^7.7",
|
||||
"spatie/laravel-sitemap": "^7.3",
|
||||
"spatie/laravel-tags": "^4.10",
|
||||
"symfony/dom-crawler": "^7.3",
|
||||
"tightenco/ziggy": "^2.4",
|
||||
|
||||
325
composer.lock
generated
325
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "dbe9b4012c67d84fc322f58ddb9af791",
|
||||
"content-hash": "79a02fbcd504e47b61331dad19bd62a0",
|
||||
"packages": [
|
||||
{
|
||||
"name": "artesaos/seotools",
|
||||
@@ -4327,6 +4327,60 @@
|
||||
},
|
||||
"time": "2025-03-30T21:06:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nicmart/tree",
|
||||
"version": "0.9.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nicmart/Tree.git",
|
||||
"reference": "f5e17bf18d78cfb0666ebb9f956c3acd8d14229d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nicmart/Tree/zipball/f5e17bf18d78cfb0666ebb9f956c3acd8d14229d",
|
||||
"reference": "f5e17bf18d78cfb0666ebb9f956c3acd8d14229d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ergebnis/composer-normalize": "^2.44.0",
|
||||
"ergebnis/license": "^2.6.0",
|
||||
"ergebnis/php-cs-fixer-config": "^6.28.1",
|
||||
"fakerphp/faker": "^1.24.1",
|
||||
"infection/infection": "~0.26.19",
|
||||
"phpunit/phpunit": "^9.6.19",
|
||||
"psalm/plugin-phpunit": "~0.19.0",
|
||||
"vimeo/psalm": "^5.26.1"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Tree\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolò Martini",
|
||||
"email": "nicmartnic@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Andreas Möller",
|
||||
"email": "am@localheinz.com"
|
||||
}
|
||||
],
|
||||
"description": "A basic but flexible php tree data structure and a fluent tree builder implementation.",
|
||||
"support": {
|
||||
"issues": "https://github.com/nicmart/Tree/issues",
|
||||
"source": "https://github.com/nicmart/Tree/tree/0.9.0"
|
||||
},
|
||||
"time": "2024-11-22T15:36:01+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v5.4.0",
|
||||
@@ -5857,6 +5911,142 @@
|
||||
],
|
||||
"time": "2024-04-27T21:32:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/browsershot",
|
||||
"version": "5.0.10",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/spatie/browsershot.git",
|
||||
"reference": "9e5ae15487b3cdc3eb03318c1c8ac38971f60e58"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/spatie/browsershot/zipball/9e5ae15487b3cdc3eb03318c1c8ac38971f60e58",
|
||||
"reference": "9e5ae15487b3cdc3eb03318c1c8ac38971f60e58",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-fileinfo": "*",
|
||||
"ext-json": "*",
|
||||
"php": "^8.2",
|
||||
"spatie/temporary-directory": "^2.0",
|
||||
"symfony/process": "^6.0|^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"pestphp/pest": "^3.0",
|
||||
"spatie/image": "^3.6",
|
||||
"spatie/pdf-to-text": "^1.52",
|
||||
"spatie/phpunit-snapshot-assertions": "^4.2.3|^5.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Spatie\\Browsershot\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Freek Van der Herten",
|
||||
"email": "freek@spatie.be",
|
||||
"homepage": "https://github.com/freekmurze",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Convert a webpage to an image or pdf using headless Chrome",
|
||||
"homepage": "https://github.com/spatie/browsershot",
|
||||
"keywords": [
|
||||
"chrome",
|
||||
"convert",
|
||||
"headless",
|
||||
"image",
|
||||
"pdf",
|
||||
"puppeteer",
|
||||
"screenshot",
|
||||
"webpage"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/spatie/browsershot/tree/5.0.10"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/spatie",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2025-05-15T07:10:57+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/crawler",
|
||||
"version": "8.4.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/spatie/crawler.git",
|
||||
"reference": "4f4c3ead439e7e57085c0b802bc4e5b44fb7d751"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/spatie/crawler/zipball/4f4c3ead439e7e57085c0b802bc4e5b44fb7d751",
|
||||
"reference": "4f4c3ead439e7e57085c0b802bc4e5b44fb7d751",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"guzzlehttp/guzzle": "^7.3",
|
||||
"guzzlehttp/psr7": "^2.0",
|
||||
"illuminate/collections": "^10.0|^11.0|^12.0",
|
||||
"nicmart/tree": "^0.9",
|
||||
"php": "^8.2",
|
||||
"spatie/browsershot": "^5.0.5",
|
||||
"spatie/robots-txt": "^2.0",
|
||||
"symfony/dom-crawler": "^6.0|^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"pestphp/pest": "^2.0|^3.0",
|
||||
"spatie/ray": "^1.37"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Spatie\\Crawler\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Freek Van der Herten",
|
||||
"email": "freek@spatie.be"
|
||||
}
|
||||
],
|
||||
"description": "Crawl all internal links found on a website",
|
||||
"homepage": "https://github.com/spatie/crawler",
|
||||
"keywords": [
|
||||
"crawler",
|
||||
"link",
|
||||
"spatie",
|
||||
"website"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/spatie/crawler/issues",
|
||||
"source": "https://github.com/spatie/crawler/tree/8.4.3"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://spatie.be/open-source/support-us",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/spatie",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2025-05-20T09:00:51+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/eloquent-sortable",
|
||||
"version": "4.5.0",
|
||||
@@ -6075,6 +6265,79 @@
|
||||
],
|
||||
"time": "2025-05-20T08:39:19+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/laravel-sitemap",
|
||||
"version": "7.3.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/spatie/laravel-sitemap.git",
|
||||
"reference": "506b2acdd350c7ff868a7711b4f30e486b20e9b0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/spatie/laravel-sitemap/zipball/506b2acdd350c7ff868a7711b4f30e486b20e9b0",
|
||||
"reference": "506b2acdd350c7ff868a7711b4f30e486b20e9b0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"guzzlehttp/guzzle": "^7.8",
|
||||
"illuminate/support": "^11.0|^12.0",
|
||||
"nesbot/carbon": "^2.71|^3.0",
|
||||
"php": "^8.2||^8.3||^8.4",
|
||||
"spatie/crawler": "^8.0.1",
|
||||
"spatie/laravel-package-tools": "^1.16.1",
|
||||
"symfony/dom-crawler": "^6.3.4|^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"mockery/mockery": "^1.6.6",
|
||||
"orchestra/testbench": "^9.0|^10.0",
|
||||
"pestphp/pest": "^3.7.4",
|
||||
"spatie/pest-plugin-snapshots": "^2.1",
|
||||
"spatie/phpunit-snapshot-assertions": "^5.1.2",
|
||||
"spatie/temporary-directory": "^2.2"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Spatie\\Sitemap\\SitemapServiceProvider"
|
||||
]
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Spatie\\Sitemap\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Freek Van der Herten",
|
||||
"email": "freek@spatie.be",
|
||||
"homepage": "https://spatie.be",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Create and generate sitemaps with ease",
|
||||
"homepage": "https://github.com/spatie/laravel-sitemap",
|
||||
"keywords": [
|
||||
"laravel-sitemap",
|
||||
"spatie"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/spatie/laravel-sitemap/tree/7.3.6"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://spatie.be/open-source/support-us",
|
||||
"type": "custom"
|
||||
}
|
||||
],
|
||||
"time": "2025-04-10T12:13:41+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/laravel-tags",
|
||||
"version": "4.10.0",
|
||||
@@ -6228,6 +6491,66 @@
|
||||
],
|
||||
"time": "2025-02-20T15:51:22+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/robots-txt",
|
||||
"version": "2.5.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/spatie/robots-txt.git",
|
||||
"reference": "ef85dfaa48372c0a7fdfb144592f95de1a2e9b79"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/spatie/robots-txt/zipball/ef85dfaa48372c0a7fdfb144592f95de1a2e9b79",
|
||||
"reference": "ef85dfaa48372c0a7fdfb144592f95de1a2e9b79",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^11.5.2"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Spatie\\Robots\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Brent Roose",
|
||||
"email": "brent@spatie.be",
|
||||
"homepage": "https://spatie.be",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Determine if a page may be crawled from robots.txt and robots meta tags",
|
||||
"homepage": "https://github.com/spatie/robots-txt",
|
||||
"keywords": [
|
||||
"robots-txt",
|
||||
"spatie"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/spatie/robots-txt/issues",
|
||||
"source": "https://github.com/spatie/robots-txt/tree/2.5.1"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://spatie.be/open-source/support-us",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/spatie",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2025-07-01T07:07:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/temporary-directory",
|
||||
"version": "2.3.0",
|
||||
|
||||
116
config/platform/seo_descriptions.php
Normal file
116
config/platform/seo_descriptions.php
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'search_descriptions' => [
|
||||
'Create hilarious __KEYWORD__ memes with our video editor. Browse __KEYWORD__ memes perfect for sharing on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make funny __KEYWORD__ memes fast. Share with friends on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit sharp __KEYWORD__ memes in minutes. Send to friends on WhatsApp, Telegram, Discord. Works great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make clean __KEYWORD__ memes that slay. Share on WhatsApp, Telegram, Discord. Designed for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Turn clips into solid __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create scroll-stopping __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Optimized for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make short, punchy __KEYWORD__ memes. Send to your group on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit quick __KEYWORD__ memes that hit. Share on WhatsApp, Telegram, Discord. Best for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Drop clean __KEYWORD__ memes online. Send to friends on WhatsApp, Telegram, Discord. Works across TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build smooth __KEYWORD__ memes with ease. Share on WhatsApp, Telegram, Discord. Ready to post on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft tight __KEYWORD__ memes in your browser. Send to group chats on WhatsApp, Telegram, Discord. Made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Design fresh __KEYWORD__ memes fast. Share with friends on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create polished __KEYWORD__ memes. Send to your crew on WhatsApp, Telegram, Discord. Ideal for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit clean-cut __KEYWORD__ memes with no hassle. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make crisp __KEYWORD__ memes that just work. Send to friends on WhatsApp, Telegram, Discord. Works well on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build meme-ready __KEYWORD__ clips. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft easy __KEYWORD__ memes for short-form. Send to group chats on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Generate funny __KEYWORD__ memes fast. Share with friends on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Drop solid __KEYWORD__ memes from your clips. Send to your squad on WhatsApp, Telegram, Discord. Optimized for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make short-form __KEYWORD__ memes that pop. Share on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit no-fuss __KEYWORD__ memes that land. Send to friends on WhatsApp, Telegram, Discord. Works on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create well-paced __KEYWORD__ memes fast. Share on WhatsApp, Telegram, Discord. Ideal for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Design sharp-looking __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Turn moments into funny __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Best for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make funny __KEYWORD__ memes with MEMEFA.ST! Send to your crew on WhatsApp, Telegram, Discord. Works across TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit fast and funny __KEYWORD__ memes online. Share on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft __KEYWORD__ memes with ease. Send to friends on WhatsApp, Telegram, Discord. Designed for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build meme edits that feel right. Share on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create scroll-stopping __KEYWORD__ memes in seconds. Send to group chats on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make cool, clean __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Fits TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit funny __KEYWORD__ memes. Send to your squad on WhatsApp, Telegram, Discord. Ideal for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Drop funny __KEYWORD__ memes to your friends. Share on WhatsApp, Telegram, Discord. Format fits TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft fast, fun __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build clean meme formats for __KEYWORD__. Share with friends on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create cool-looking __KEYWORD__ memes. Send to your crew on WhatsApp, Telegram, Discord. Made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Turn quick ideas into __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Post funny __KEYWORD__ memes to friends. Send on WhatsApp, Telegram, Discord. Great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make feed-friendly __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Optimized for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit short and funny __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Perfect fit for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create fast edits for __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build simple __KEYWORD__ memes that hit. Send to friends on WhatsApp, Telegram, Discord. Works everywhere: TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft no-frills __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Designed for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit funny, format-ready __KEYWORD__ memes. Send to your squad on WhatsApp, Telegram, Discord. For TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Drop quick laughs with __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make meme-worthy __KEYWORD__ clips. Send to group chats on WhatsApp, Telegram, Discord. Works best on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create short-form memes with __KEYWORD__. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Design TikTok-ready __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Also works for Instagram Reels and YouTube Shorts.',
|
||||
'Build meme videos around __KEYWORD__. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft quick meme edits for __KEYWORD__. Send to your crew on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Generate clean __KEYWORD__ memes fast. Share with friends on WhatsApp, Telegram, Discord. Designed for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make to-the-point __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit compact __KEYWORD__ memes with ease. Share on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create meme videos around __KEYWORD__. Send to friends on WhatsApp, Telegram, Discord. Formats made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Drop clean meme clips for __KEYWORD__. Share on WhatsApp, Telegram, Discord. Best for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build creator-friendly __KEYWORD__ memes. Send to your squad on WhatsApp, Telegram, Discord. Ideal for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make short, solid __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Works on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit smooth __KEYWORD__ memes in minutes. Send to group chats on WhatsApp, Telegram, Discord. Great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft low-effort __KEYWORD__ memes that hit. Share on WhatsApp, Telegram, Discord. Designed for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create fast-turnaround __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Design clean meme edits around __KEYWORD__. Share on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build high-replay __KEYWORD__ memes. Send to your crew on WhatsApp, Telegram, Discord. Made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make meme-worthy short videos with __KEYWORD__. Share with friends on WhatsApp, Telegram, Discord. Great on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Drop funny clips with __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create instantly watchable __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. For TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Design videos around __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Works on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build ready-to-post __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Best for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft on-trend __KEYWORD__ memes fast. Send to your squad on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit memes with __KEYWORD__ that feel current. Share with friends on WhatsApp, Telegram, Discord. Works on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create funny __KEYWORD__ clips that loop well. Send to group chats on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make clean, short __KEYWORD__ edits. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Drop relatable __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Generate quick meme takes on __KEYWORD__. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build video memes with __KEYWORD__ in seconds. Send to your crew on WhatsApp, Telegram, Discord. Optimized for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit short meme clips using __KEYWORD__. Share with friends on WhatsApp, Telegram, Discord. Works for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create smooth meme edits with __KEYWORD__. Send to group chats on WhatsApp, Telegram, Discord. For TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make fast content using __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Craft short-form comedy with __KEYWORD__. Send to friends on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Design meme videos fast with __KEYWORD__. Share on WhatsApp, Telegram, Discord. Best for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build scrollable __KEYWORD__ memes. Send to your squad on WhatsApp, Telegram, Discord. Formats made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create short, clever __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit quick takes with __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make watchable meme clips using __KEYWORD__. Share on WhatsApp, Telegram, Discord. Works great on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Turn trends into __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Build fast meme edits featuring __KEYWORD__. Share on WhatsApp, Telegram, Discord. For TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create funny __KEYWORD__ content. Send to your crew on WhatsApp, Telegram, Discord. Works seamlessly across TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit meme videos using __KEYWORD__. Share with friends on WhatsApp, Telegram, Discord. Match TikTok, Instagram Reels, and YouTube Shorts formats.',
|
||||
'Drop clean __KEYWORD__ content for short-form feeds. Send to group chats on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make smart edits with __KEYWORD__. Share on WhatsApp, Telegram, Discord. Optimized for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Generate short-form __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Create meme videos around __KEYWORD__. Share on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Edit short and shareable __KEYWORD__ memes. Send to your squad on WhatsApp, Telegram, Discord. Post to TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Make well-timed __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Browse funny __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Find hilarious __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Discover trending __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Search cool __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Get fresh __KEYWORD__ memes. Send to your crew on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Pick awesome __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Works on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Choose top __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Select viral __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Download funny __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Save hilarious __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Grab trending __KEYWORD__ memes. Send to your squad on WhatsApp, Telegram, Discord. Works on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Access cool __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Use fresh __KEYWORD__ memes. Send to group chats on WhatsApp, Telegram, Discord. Great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Watch funny __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Perfect for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'View hilarious __KEYWORD__ memes. Send to friends on WhatsApp, Telegram, Discord. Built for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Stream trending __KEYWORD__ memes. Share on WhatsApp, Telegram, Discord. Works on TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Play cool __KEYWORD__ memes. Send to your crew on WhatsApp, Telegram, Discord. Made for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
'Check out fresh __KEYWORD__ memes. Share with friends on WhatsApp, Telegram, Discord. Great for TikTok, Instagram Reels, and YouTube Shorts.',
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('meme_medias', function (Blueprint $table) {
|
||||
$table->string('slug')->nullable()->after('name');
|
||||
$table->index('slug');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('meme_medias', function (Blueprint $table) {
|
||||
$table->dropIndex(['slug']);
|
||||
$table->dropColumn('slug');
|
||||
});
|
||||
}
|
||||
};
|
||||
BIN
public/memefast-og-template.jpg
Normal file
BIN
public/memefast-og-template.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 230 KiB |
@@ -1,2 +1,4 @@
|
||||
User-agent: *
|
||||
Disallow:
|
||||
|
||||
Sitemap: https://memefast.app/sitemap.xml
|
||||
|
||||
BIN
resources/fonts/Geist/Geist-Black.ttf
Normal file
BIN
resources/fonts/Geist/Geist-Black.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-Bold.ttf
Normal file
BIN
resources/fonts/Geist/Geist-Bold.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-ExtraBold.ttf
Normal file
BIN
resources/fonts/Geist/Geist-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-ExtraLight.ttf
Normal file
BIN
resources/fonts/Geist/Geist-ExtraLight.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-Light.ttf
Normal file
BIN
resources/fonts/Geist/Geist-Light.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-Medium.ttf
Normal file
BIN
resources/fonts/Geist/Geist-Medium.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-Regular.ttf
Normal file
BIN
resources/fonts/Geist/Geist-Regular.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-SemiBold.ttf
Normal file
BIN
resources/fonts/Geist/Geist-SemiBold.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-Thin.ttf
Normal file
BIN
resources/fonts/Geist/Geist-Thin.ttf
Normal file
Binary file not shown.
BIN
resources/fonts/Geist/Geist-VariableFont_wght.ttf
Normal file
BIN
resources/fonts/Geist/Geist-VariableFont_wght.ttf
Normal file
Binary file not shown.
93
resources/fonts/Geist/OFL.txt
Normal file
93
resources/fonts/Geist/OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2024 The Geist Project Authors (https://github.com/vercel/geist-font.git)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
https://openfontlicense.org
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
71
resources/fonts/Geist/README.txt
Normal file
71
resources/fonts/Geist/README.txt
Normal file
@@ -0,0 +1,71 @@
|
||||
Geist Variable Font
|
||||
===================
|
||||
|
||||
This download contains Geist as both a variable font and static fonts.
|
||||
|
||||
Geist is a variable font with this axis:
|
||||
wght
|
||||
|
||||
This means all the styles are contained in a single file:
|
||||
Geist/Geist-VariableFont_wght.ttf
|
||||
|
||||
If your app fully supports variable fonts, you can now pick intermediate styles
|
||||
that aren’t available as static fonts. Not all apps support variable fonts, and
|
||||
in those cases you can use the static font files for Geist:
|
||||
Geist/static/Geist-Thin.ttf
|
||||
Geist/static/Geist-ExtraLight.ttf
|
||||
Geist/static/Geist-Light.ttf
|
||||
Geist/static/Geist-Regular.ttf
|
||||
Geist/static/Geist-Medium.ttf
|
||||
Geist/static/Geist-SemiBold.ttf
|
||||
Geist/static/Geist-Bold.ttf
|
||||
Geist/static/Geist-ExtraBold.ttf
|
||||
Geist/static/Geist-Black.ttf
|
||||
|
||||
Get started
|
||||
-----------
|
||||
|
||||
1. Install the font files you want to use
|
||||
|
||||
2. Use your app's font picker to view the font family and all the
|
||||
available styles
|
||||
|
||||
Learn more about variable fonts
|
||||
-------------------------------
|
||||
|
||||
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
|
||||
https://variablefonts.typenetwork.com
|
||||
https://medium.com/variable-fonts
|
||||
|
||||
In desktop apps
|
||||
|
||||
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
|
||||
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
|
||||
|
||||
Online
|
||||
|
||||
https://developers.google.com/fonts/docs/getting_started
|
||||
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
|
||||
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
|
||||
|
||||
Installing fonts
|
||||
|
||||
MacOS: https://support.apple.com/en-us/HT201749
|
||||
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
|
||||
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
|
||||
|
||||
Android Apps
|
||||
|
||||
https://developers.google.com/fonts/docs/android
|
||||
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
|
||||
|
||||
License
|
||||
-------
|
||||
Please read the full license text (OFL.txt) to understand the permissions,
|
||||
restrictions and requirements for usage, redistribution, and modification.
|
||||
|
||||
You can use them in your products & projects – print or digital,
|
||||
commercial or otherwise.
|
||||
|
||||
This isn't legal advice, please consider consulting a lawyer and see the full
|
||||
license for all details.
|
||||
89
resources/js/components/custom/meme-card.tsx
Normal file
89
resources/js/components/custom/meme-card.tsx
Normal file
@@ -0,0 +1,89 @@
|
||||
import { Badge } from '@/components/ui/badge';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Card } from '@/components/ui/card';
|
||||
import { KeywordBadge } from '@/components/ui/keyword-badge';
|
||||
import { Link } from '@inertiajs/react';
|
||||
import { Edit } from 'lucide-react';
|
||||
import { route } from 'ziggy-js';
|
||||
|
||||
interface MemeMedia {
|
||||
ids: string;
|
||||
name: string;
|
||||
description: string;
|
||||
keywords: string[];
|
||||
action_keywords: string[];
|
||||
emotion_keywords: string[];
|
||||
misc_keywords: string[];
|
||||
mov_url: string;
|
||||
webm_url: string;
|
||||
gif_url: string;
|
||||
webp_url: string;
|
||||
slug: string;
|
||||
}
|
||||
|
||||
interface MemeCardProps {
|
||||
meme: MemeMedia;
|
||||
showButton?: boolean;
|
||||
showKeywords?: boolean;
|
||||
className?: string;
|
||||
}
|
||||
|
||||
export function MemeCard({ meme, showButton = true, showKeywords = true, className = '' }: MemeCardProps) {
|
||||
return (
|
||||
<Card className={`group flex flex-col overflow-hidden p-0 transition-shadow hover:shadow-lg ${className}`}>
|
||||
<div
|
||||
className="relative aspect-[9/16] overflow-hidden"
|
||||
style={{
|
||||
backgroundColor: '#ffffff',
|
||||
backgroundImage: `
|
||||
linear-gradient(45deg, #cccccc 25%, transparent 25%),
|
||||
linear-gradient(-45deg, #cccccc 25%, transparent 25%),
|
||||
linear-gradient(45deg, transparent 75%, #cccccc 75%),
|
||||
linear-gradient(-45deg, transparent 75%, #cccccc 75%)
|
||||
`,
|
||||
backgroundSize: '20px 20px',
|
||||
backgroundPosition: '0 0, 0 10px, 10px -10px, -10px 0px'
|
||||
}}
|
||||
>
|
||||
<img
|
||||
src={meme.webp_url}
|
||||
alt={meme.name}
|
||||
className="h-full w-full object-cover transition-transform group-hover:scale-105"
|
||||
/>
|
||||
<Link
|
||||
href={route('memes.show', meme.slug)}
|
||||
className="bg-opacity-0 absolute inset-0 flex items-center justify-center transition-all group-hover:opacity-40 hover:bg-black"
|
||||
>
|
||||
<Edit className="h-8 w-8 text-white opacity-0 transition-opacity group-hover:opacity-100" />
|
||||
</Link>
|
||||
</div>
|
||||
<div className="flex flex-grow flex-col px-4 pt-0 pb-4">
|
||||
<h3 className="text-foreground mb-2 line-clamp-2 text-sm font-semibold">{meme.name}</h3>
|
||||
{showKeywords && (
|
||||
<div className="mb-3 flex flex-wrap gap-1">
|
||||
{meme.keywords?.slice(0, 6).map((keyword, index) => (
|
||||
<KeywordBadge key={index} keyword={keyword} />
|
||||
))}
|
||||
{meme.keywords && meme.keywords.length > 6 && (
|
||||
<Badge variant="secondary" className="text-xs">
|
||||
+{meme.keywords.length - 6} more
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
{showButton && (
|
||||
<div className="mt-auto">
|
||||
<Link href={route('memes.show', meme.slug)}>
|
||||
<Button
|
||||
size="sm"
|
||||
className="w-full bg-gradient-to-r from-purple-600 to-pink-600 text-white hover:from-purple-700 hover:to-pink-700"
|
||||
>
|
||||
Use meme
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</Card>
|
||||
);
|
||||
}
|
||||
24
resources/js/components/ui/keyword-badge.tsx
Normal file
24
resources/js/components/ui/keyword-badge.tsx
Normal file
@@ -0,0 +1,24 @@
|
||||
import { Link } from '@inertiajs/react';
|
||||
import { route } from 'ziggy-js';
|
||||
|
||||
interface KeywordBadgeProps {
|
||||
keyword: string;
|
||||
size?: 'default' | 'lg';
|
||||
className?: string;
|
||||
}
|
||||
|
||||
const sizeClasses = {
|
||||
default: 'px-2.5 py-0.5 text-xs',
|
||||
lg: 'px-3 py-1 text-sm',
|
||||
};
|
||||
|
||||
export function KeywordBadge({ keyword, size = 'default', className = '' }: KeywordBadgeProps) {
|
||||
return (
|
||||
<Link
|
||||
href={route('memes.search', keyword.replace(/\s+/g, '+'))}
|
||||
className={`inline-flex items-center rounded-full border border-transparent bg-secondary text-secondary-foreground font-semibold transition-colors hover:bg-purple-600 hover:text-white focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 ${sizeClasses[size]} ${className}`}
|
||||
>
|
||||
{keyword}
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
@@ -107,8 +107,8 @@ const useResponsiveDimensions = () => {
|
||||
return dimensions;
|
||||
};
|
||||
|
||||
const Editor = () => {
|
||||
const { init } = useMediaStore();
|
||||
const Editor = ({ setInitialMeme, setInitialBackground, setInitialText }) => {
|
||||
const { init, setInitialMeme: setStoreMeme, setInitialBackground: setStoreBackground, setInitialText: setStoreText, clearInitialState } = useMediaStore();
|
||||
const { getSetting } = useLocalSettingsStore();
|
||||
const { setSelectedTextElement } = useVideoEditorStore();
|
||||
const emitter = useMitt();
|
||||
@@ -121,8 +121,28 @@ const Editor = () => {
|
||||
const isBelowMinWidth = useViewportDetection(320);
|
||||
|
||||
useEffect(() => {
|
||||
// Clear any previous initial state to allow fresh initialization
|
||||
clearInitialState();
|
||||
|
||||
// Set initial values if props are provided
|
||||
if (setInitialMeme) {
|
||||
setInitialMeme(setStoreMeme);
|
||||
}
|
||||
if (setInitialBackground) {
|
||||
setInitialBackground(setStoreBackground);
|
||||
}
|
||||
if (setInitialText) {
|
||||
setInitialText(setStoreText);
|
||||
}
|
||||
|
||||
// Initialize (will skip API call if initial values were set)
|
||||
init();
|
||||
}, []);
|
||||
|
||||
// Cleanup: Clear initial state when component unmounts
|
||||
return () => {
|
||||
clearInitialState();
|
||||
};
|
||||
}, [setInitialMeme, setInitialBackground, setInitialText, setStoreMeme, setStoreBackground, setStoreText, init, clearInitialState]);
|
||||
|
||||
// Listen for text element selection (but don't auto-open sidebar)
|
||||
useEffect(() => {
|
||||
@@ -173,7 +193,7 @@ const Editor = () => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="relative mx-auto flex min-h-[93vh] flex-col space-y-2 pt-4" style={{ width: `${responsiveWidth}px` }}>
|
||||
<div className="relative mx-auto flex min-h-[88vh] flex-col space-y-2" style={{ width: `${responsiveWidth}px` }}>
|
||||
<EditSidebar isOpen={isEditSidebarOpen} onClose={handleEditClose} />
|
||||
<EditNavSidebar isOpen={isEditNavSidebarOpen} onClose={handleEditNavClose} />
|
||||
<TextSidebar isOpen={isTextSidebarOpen} onClose={handleTextSidebarClose} />
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { cn } from '@/lib/utils';
|
||||
import { useMitt } from '@/plugins/MittContext';
|
||||
import useLocalSettingsStore from '@/stores/localSettingsStore';
|
||||
|
||||
@@ -12,14 +11,8 @@ const EditorHeader = ({ className = '', onNavClick = () => {}, isNavActive = fal
|
||||
};
|
||||
|
||||
return (
|
||||
<div className={cn('flex w-full items-center justify-center gap-2', className)}>
|
||||
<img alt="MEMEFA.ST LOGO" className="h-10 w-10" src="logo/memefast-logo-144.png"></img>
|
||||
|
||||
<div className="font-display ml-0 text-lg tracking-wide md:ml-3 md:text-xl">
|
||||
<span className="text-foreground">MEME</span>
|
||||
<span className="text-[#00DD00] dark:text-[#00FF00]">FAST</span>
|
||||
</div>
|
||||
</div>
|
||||
<></>
|
||||
// <BrandLogo></BrandLogo>
|
||||
// <div className={cn('flex w-full items-center justify-between rounded-xl bg-white p-2 shadow-sm dark:bg-neutral-800', className)}>
|
||||
// <Button onClick={onNavClick} variant="outline" size="icon" className="invisible rounded">
|
||||
// <Menu className="h-8 w-8" />
|
||||
|
||||
29
resources/js/pages/FrontPages/DmcaCopyright.tsx
Normal file
29
resources/js/pages/FrontPages/DmcaCopyright.tsx
Normal file
@@ -0,0 +1,29 @@
|
||||
import Footer from '@/pages/home/partials/Footer.jsx';
|
||||
import { Head } from '@inertiajs/react';
|
||||
import React from 'react';
|
||||
|
||||
interface DmcaCopyrightProps {
|
||||
content: string;
|
||||
title: string;
|
||||
}
|
||||
|
||||
const DmcaCopyright: React.FC<DmcaCopyrightProps> = ({ content, title }) => {
|
||||
return (
|
||||
<div className="min-h-[100vh] bg-neutral-50 dark:bg-black">
|
||||
<Head title={title} />
|
||||
|
||||
<div className="container mx-auto px-4 py-8">
|
||||
<div className="mx-auto max-w-4xl">
|
||||
<div className="rounded-lg bg-white p-8 shadow-lg dark:bg-neutral-900">
|
||||
<div className="max-w-none" dangerouslySetInnerHTML={{ __html: content }} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Footer />
|
||||
{/* <AuthUser /> */}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DmcaCopyright;
|
||||
@@ -1,10 +1,12 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import BrandLogo from './partials/BrandLogo.jsx';
|
||||
import FAQDiscord from './partials/FAQDiscord.jsx';
|
||||
import Features from './partials/Features.jsx';
|
||||
import Footer from './partials/Footer.jsx';
|
||||
import Hero from './partials/Hero.jsx';
|
||||
import MemeLibrarySearch from './partials/MemeLibrarySearch.jsx';
|
||||
|
||||
const Home = ({ faqData }) => {
|
||||
const Home = ({ faqData, popularKeywords }) => {
|
||||
const [isClient, setIsClient] = useState(false);
|
||||
const [Editor, setEditor] = useState(null);
|
||||
|
||||
@@ -19,7 +21,8 @@ const Home = ({ faqData }) => {
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="min-h-[100vh] bg-neutral-50 pb-10 dark:bg-black">
|
||||
<div className="min-h-[100vh] space-y-0 bg-neutral-50 py-6 dark:bg-black">
|
||||
<BrandLogo className="pb-2" />
|
||||
<div className="to-muted/10 w-full bg-gradient-to-b from-transparent dark:from-transparent dark:to-neutral-900">
|
||||
{isClient && Editor ? (
|
||||
<Editor />
|
||||
@@ -29,8 +32,9 @@ const Home = ({ faqData }) => {
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="space-y-16 pt-6">
|
||||
<div className="space-y-16">
|
||||
<Hero />
|
||||
<MemeLibrarySearch popularKeywords={popularKeywords} />
|
||||
<Features />
|
||||
<FAQDiscord faqData={faqData} />
|
||||
</div>
|
||||
|
||||
18
resources/js/pages/home/partials/BrandLogo.jsx
Normal file
18
resources/js/pages/home/partials/BrandLogo.jsx
Normal file
@@ -0,0 +1,18 @@
|
||||
import { cn } from '@/lib/utils';
|
||||
import { Link } from '@inertiajs/react';
|
||||
import { route } from 'ziggy-js';
|
||||
|
||||
const BrandLogo = ({ className = '', onNavClick = () => {}, isNavActive = false }) => {
|
||||
return (
|
||||
<Link href={route('home')} className={cn('flex w-full items-center justify-center gap-2 hover:opacity-80 transition-opacity', className)}>
|
||||
<img alt="MEMEFA.ST LOGO" className="h-10 w-10" src="/logo/memefast-logo-144.png"></img>
|
||||
|
||||
<div className="font-display ml-0 text-lg tracking-wide md:ml-3 md:text-xl">
|
||||
<span className="text-foreground">MEME</span>
|
||||
<span className="text-[#00DD00] dark:text-[#00FF00]">FAST</span>
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
|
||||
export default BrandLogo;
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Switch } from '@/components/ui/switch';
|
||||
import { useTheme } from '@/hooks/useTheme';
|
||||
import { Moon, Sun } from 'lucide-react';
|
||||
import { route } from 'ziggy-js';
|
||||
|
||||
const Footer = () => {
|
||||
const currentYear = new Date().getFullYear();
|
||||
@@ -28,15 +29,21 @@ const Footer = () => {
|
||||
|
||||
{/* Navigation Links */}
|
||||
<div className="flex space-x-6">
|
||||
<a href="/" className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
<a href={route('home')} className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
Home
|
||||
</a>
|
||||
<a href="/terms" className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
<a href={route('memes.index')} className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
Meme Library
|
||||
</a>
|
||||
<a href={route('terms')} className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
Terms
|
||||
</a>
|
||||
<a href="/privacy" className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
<a href={route('privacy')} className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
Privacy
|
||||
</a>
|
||||
<a href={route('dmca-copyright')} className="text-muted-foreground hover:text-foreground text-sm transition-colors">
|
||||
DMCA
|
||||
</a>
|
||||
{import.meta.env.VITE_DISCORD_LINK && (
|
||||
<a
|
||||
href={import.meta.env.VITE_DISCORD_LINK}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import CountUp from '@/components/reactbits/CountUp/CountUp';
|
||||
import { usePage } from '@inertiajs/react';
|
||||
|
||||
const Hero = () => {
|
||||
@@ -29,7 +28,7 @@ const Hero = () => {
|
||||
</div>
|
||||
|
||||
{/* Stats */}
|
||||
<div className="flex flex-wrap justify-center gap-8 sm:gap-12">
|
||||
{/* <div className="flex flex-wrap justify-center gap-8 sm:gap-12">
|
||||
<div className="text-center">
|
||||
<CountUp
|
||||
from={0}
|
||||
@@ -58,7 +57,7 @@ const Hero = () => {
|
||||
<div className="text-foreground text-3xl font-bold sm:text-4xl">720p</div>
|
||||
<div className="text-muted-foreground text-sm">Export</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> */}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
106
resources/js/pages/home/partials/MemeLibrarySearch.jsx
Normal file
106
resources/js/pages/home/partials/MemeLibrarySearch.jsx
Normal file
@@ -0,0 +1,106 @@
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Input } from '@/components/ui/input';
|
||||
import { KeywordBadge } from '@/components/ui/keyword-badge';
|
||||
import { router } from '@inertiajs/react';
|
||||
import { Search } from 'lucide-react';
|
||||
import { useState } from 'react';
|
||||
import { route } from 'ziggy-js';
|
||||
|
||||
const MemeLibrarySearch = ({ popularKeywords = [] }) => {
|
||||
const [searchQuery, setSearchQuery] = useState('');
|
||||
const [isSearching, setIsSearching] = useState(false);
|
||||
|
||||
const handleSearch = (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
if (!searchQuery.trim()) {
|
||||
// If empty search, go to main meme library
|
||||
router.visit(route('memes.index'));
|
||||
return;
|
||||
}
|
||||
|
||||
setIsSearching(true);
|
||||
|
||||
// Navigate to search results page
|
||||
router.visit(route('memes.search', { search: searchQuery.trim() }), {
|
||||
onFinish: () => setIsSearching(false),
|
||||
});
|
||||
};
|
||||
|
||||
const handleKeyPress = (e) => {
|
||||
if (e.key === 'Enter') {
|
||||
handleSearch(e);
|
||||
}
|
||||
};
|
||||
|
||||
const handleKeywordClick = (keyword) => {
|
||||
setSearchQuery(keyword);
|
||||
setIsSearching(true);
|
||||
router.visit(route('memes.search', { search: keyword }), {
|
||||
onFinish: () => setIsSearching(false),
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<section className="relative">
|
||||
<div className="mx-auto max-w-4xl px-4 sm:px-6 lg:px-8">
|
||||
<div className="space-y-6 text-center">
|
||||
{/* Section heading */}
|
||||
<div className="space-y-2">
|
||||
<h2 className="text-foreground text-3xl font-bold tracking-tight sm:text-4xl">Find the perfect meme</h2>
|
||||
<p className="text-muted-foreground mx-auto max-w-2xl text-lg">
|
||||
Search through our database of popular meme templates and find the perfect one for your video
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Search form */}
|
||||
<form onSubmit={handleSearch} className="mx-auto max-w-xl">
|
||||
<div className="flex gap-2">
|
||||
<div className="relative flex-1">
|
||||
<Search className="text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2" />
|
||||
<Input
|
||||
type="text"
|
||||
placeholder="Search memes... "
|
||||
value={searchQuery}
|
||||
onChange={(e) => setSearchQuery(e.target.value)}
|
||||
onKeyPress={handleKeyPress}
|
||||
className="h-12 py-3 pr-4 pl-10 text-base"
|
||||
disabled={isSearching}
|
||||
/>
|
||||
</div>
|
||||
<Button type="submit" size="lg" disabled={isSearching} className="h-12 px-6">
|
||||
{isSearching ? 'Searching...' : 'Search'}
|
||||
</Button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{/* Popular Keywords */}
|
||||
{popularKeywords.length > 0 && (
|
||||
<div className="space-y-3">
|
||||
<div className="flex flex-wrap justify-center gap-2">
|
||||
{popularKeywords.map((keyword, index) => (
|
||||
<KeywordBadge
|
||||
size="lg"
|
||||
key={index}
|
||||
keyword={keyword}
|
||||
onClick={() => handleKeywordClick(keyword)}
|
||||
disabled={isSearching}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Browse all link */}
|
||||
<div className="pt-4">
|
||||
<Button variant="outline" onClick={() => router.visit(route('memes.index'))} className="gap-2">
|
||||
or Browse our Meme Library
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default MemeLibrarySearch;
|
||||
240
resources/js/pages/memes/index.tsx
Normal file
240
resources/js/pages/memes/index.tsx
Normal file
@@ -0,0 +1,240 @@
|
||||
import { MemeCard } from '@/components/custom/meme-card';
|
||||
import { Badge } from '@/components/ui/badge';
|
||||
import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from '@/components/ui/breadcrumb';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Card, CardContent } from '@/components/ui/card';
|
||||
import { Input } from '@/components/ui/input';
|
||||
import { KeywordBadge } from '@/components/ui/keyword-badge';
|
||||
import Footer from '@/pages/home/partials/Footer';
|
||||
import { Link, router } from '@inertiajs/react';
|
||||
import { Search } from 'lucide-react';
|
||||
import { useState } from 'react';
|
||||
import { route } from 'ziggy-js';
|
||||
import BrandLogo from '../home/partials/BrandLogo';
|
||||
|
||||
interface MemeMedia {
|
||||
ids: string;
|
||||
name: string;
|
||||
description: string;
|
||||
keywords: string[];
|
||||
action_keywords: string[];
|
||||
emotion_keywords: string[];
|
||||
misc_keywords: string[];
|
||||
mov_url: string;
|
||||
webm_url: string;
|
||||
gif_url: string;
|
||||
webp_url: string;
|
||||
slug: string;
|
||||
}
|
||||
|
||||
interface CursorPaginatedMemes {
|
||||
data: MemeMedia[];
|
||||
next_cursor: string | null;
|
||||
prev_cursor: string | null;
|
||||
next_page_url: string | null;
|
||||
prev_page_url: string | null;
|
||||
per_page: number;
|
||||
path: string;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
memes: CursorPaginatedMemes;
|
||||
types: string[];
|
||||
popularKeywords: string[];
|
||||
filters: {
|
||||
search?: string;
|
||||
};
|
||||
dynamicDescription?: string;
|
||||
}
|
||||
|
||||
export default function MemesIndex({ memes, popularKeywords, filters, dynamicDescription }: Props) {
|
||||
const [search, setSearch] = useState(filters.search || '');
|
||||
|
||||
const handleSearch = (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
navigateToSearch(search);
|
||||
};
|
||||
|
||||
const handleKeywordClick = (keyword: string) => {
|
||||
setSearch(keyword);
|
||||
navigateToSearch(keyword);
|
||||
};
|
||||
|
||||
const navigateToSearch = (searchTerm: string) => {
|
||||
if (!searchTerm.trim()) {
|
||||
router.get(route('memes.index'));
|
||||
return;
|
||||
}
|
||||
|
||||
const trimmedSearch = searchTerm.trim();
|
||||
|
||||
// Convert spaces to + for URL segment
|
||||
const urlSegment = trimmedSearch.replace(/\s+/g, '+');
|
||||
router.get(route('memes.search', urlSegment));
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="min-h-screen bg-neutral-50 pb-10 dark:bg-black">
|
||||
<div className="container mx-auto px-4 pt-8 pb-0">
|
||||
<BrandLogo className="py-3"></BrandLogo>
|
||||
|
||||
{/* Breadcrumbs */}
|
||||
<Breadcrumb className="mb-6">
|
||||
<BreadcrumbList>
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbLink asChild>
|
||||
<Link href={route('home')}>Home</Link>
|
||||
</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
<BreadcrumbSeparator />
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbPage>
|
||||
{filters.search ? `${filters.search.charAt(0).toUpperCase() + filters.search.slice(1)} Memes` : 'Meme Library'}
|
||||
</BreadcrumbPage>
|
||||
</BreadcrumbItem>
|
||||
</BreadcrumbList>
|
||||
</Breadcrumb>
|
||||
|
||||
{/* Header */}
|
||||
<div className="mb-8 text-center">
|
||||
<h1 className="text-foreground mb-4 text-4xl font-bold">
|
||||
{filters.search ? `${filters.search.charAt(0).toUpperCase() + filters.search.slice(1)} Memes` : 'Meme Library'}
|
||||
</h1>
|
||||
<p className="text-muted-foreground mx-auto max-w-2xl text-xl">
|
||||
{filters.search
|
||||
? dynamicDescription ||
|
||||
`Discover ${filters.search} meme templates and create viral content for TikTok, Instagram Reels, and YouTube Shorts.`
|
||||
: 'Thousands of memes ready for TikTok, Reels, Threads and YouTube Shorts. No signup needed - click any meme to start creating!'}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Search and Filters */}
|
||||
<Card className="mb-8">
|
||||
<CardContent className="p-6">
|
||||
<form onSubmit={handleSearch} className="mb-4 flex flex-col gap-4 md:flex-row">
|
||||
<div className="flex-1">
|
||||
<div className="relative">
|
||||
<Search className="text-muted-foreground absolute top-4 left-4 h-5 w-5" />
|
||||
<Input
|
||||
type="text"
|
||||
placeholder="Search memes..."
|
||||
value={search}
|
||||
onChange={(e) => setSearch(e.target.value)}
|
||||
className="h-12 pl-12 text-lg"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<Button
|
||||
type="submit"
|
||||
size="lg"
|
||||
className="h-12 bg-gradient-to-r from-purple-600 to-pink-600 text-lg text-white hover:from-purple-700 hover:to-pink-700"
|
||||
>
|
||||
Search
|
||||
</Button>
|
||||
</form>
|
||||
|
||||
{/* Popular Keywords */}
|
||||
<div className="mt-4">
|
||||
<h2 className="text-foreground mb-3 text-sm font-medium">Popular Keywords</h2>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{popularKeywords.map((keyword) => (
|
||||
<KeywordBadge key={keyword} keyword={keyword} size="lg" />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Active Search */}
|
||||
{filters.search && (
|
||||
<div className="mt-4 flex flex-wrap gap-2">
|
||||
<Badge variant="secondary" className="flex items-center gap-1">
|
||||
Search: {filters.search}
|
||||
<button
|
||||
onClick={() => {
|
||||
setSearch('');
|
||||
router.get(route('memes.index'));
|
||||
}}
|
||||
className="ml-1 hover:text-red-500"
|
||||
>
|
||||
×
|
||||
</button>
|
||||
</Badge>
|
||||
</div>
|
||||
)}
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Memes Grid */}
|
||||
<div className="xs:grid-cols-2 mb-8 grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6">
|
||||
{memes.data.map((meme) => (
|
||||
<MemeCard key={meme.ids} meme={meme} />
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Cursor Pagination */}
|
||||
{(memes.next_page_url || memes.prev_page_url) && (
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<div className="flex items-center justify-center gap-4">
|
||||
<div>
|
||||
{memes.prev_page_url && (
|
||||
<Link
|
||||
href={memes.prev_page_url}
|
||||
className="text-muted-foreground border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex w-32 items-center justify-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors"
|
||||
>
|
||||
← Previous
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
<div>
|
||||
{memes.next_page_url && (
|
||||
<Link
|
||||
href={memes.next_page_url}
|
||||
className="text-muted-foreground border-input bg-background hover:bg-accent hover:text-accent-foreground inline-flex w-32 items-center justify-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors"
|
||||
>
|
||||
Next →
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{memes.prev_page_url && (
|
||||
<Link
|
||||
href={route('memes.index', { ...(filters.search && { search: filters.search }) })}
|
||||
className="text-muted-foreground hover:text-foreground text-sm transition-colors"
|
||||
>
|
||||
← Back to first page
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Discord Request Section */}
|
||||
<div className="mt-12 flex flex-col items-center gap-6 text-center">
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="text-center">
|
||||
<h3 className="text-foreground text-xl font-bold">Can't find the meme you're looking for?</h3>
|
||||
<p className="text-muted-foreground text-sm leading-relaxed">
|
||||
Request it in our Discord community and we'll add it to the library!
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{import.meta.env.VITE_DISCORD_LINK && (
|
||||
<a
|
||||
href={import.meta.env.VITE_DISCORD_LINK}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="inline-flex items-center justify-center gap-2 rounded-full bg-[#5865F2] px-8 py-3 text-lg font-semibold text-white shadow-lg transition-all hover:bg-[#4752C4] hover:shadow-xl focus:ring-2 focus:ring-[#5865F2] focus:ring-offset-2 focus:outline-none"
|
||||
>
|
||||
Request in Discord
|
||||
<svg className="h-8 w-8 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
||||
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.211.375-.445.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" />
|
||||
</svg>
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
165
resources/js/pages/memes/show.tsx
Normal file
165
resources/js/pages/memes/show.tsx
Normal file
@@ -0,0 +1,165 @@
|
||||
import { MemeCard } from '@/components/custom/meme-card';
|
||||
import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from '@/components/ui/breadcrumb';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
|
||||
import { KeywordBadge } from '@/components/ui/keyword-badge';
|
||||
import { Spinner } from '@/components/ui/spinner';
|
||||
import Footer from '@/pages/home/partials/Footer';
|
||||
import { Link } from '@inertiajs/react';
|
||||
import { ArrowLeft } from 'lucide-react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { route } from 'ziggy-js';
|
||||
import BrandLogo from '../home/partials/BrandLogo';
|
||||
|
||||
interface MemeMedia {
|
||||
ids: string;
|
||||
name: string;
|
||||
description: string;
|
||||
keywords: string[];
|
||||
action_keywords: string[];
|
||||
emotion_keywords: string[];
|
||||
misc_keywords: string[];
|
||||
mov_url: string;
|
||||
webm_url: string;
|
||||
gif_url: string;
|
||||
webp_url: string;
|
||||
slug: string;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
meme: MemeMedia;
|
||||
relatedMemes: MemeMedia[];
|
||||
}
|
||||
|
||||
export default function MemeShow({ meme, relatedMemes }: Props) {
|
||||
const [isClient, setIsClient] = useState(false);
|
||||
const [Editor, setEditor] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
setIsClient(true);
|
||||
// Dynamically import Editor only on client-side to avoid SSR issues with Konva
|
||||
if (typeof window !== 'undefined') {
|
||||
import('@/modules/editor/editor.jsx').then((module) => {
|
||||
setEditor(() => module.default);
|
||||
});
|
||||
}
|
||||
}, []);
|
||||
|
||||
const allKeywords = [
|
||||
...(meme.keywords || []),
|
||||
...(meme.action_keywords || []),
|
||||
...(meme.emotion_keywords || []),
|
||||
...(meme.misc_keywords || []),
|
||||
].filter(Boolean);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="space-y-0 bg-neutral-50 py-6 dark:bg-black">
|
||||
<div className="container mx-auto px-4">
|
||||
<BrandLogo className="pb-2" />
|
||||
|
||||
{/* Breadcrumbs */}
|
||||
<Breadcrumb className="mb-6">
|
||||
<BreadcrumbList>
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbLink asChild>
|
||||
<Link href={route('home')}>Home</Link>
|
||||
</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
<BreadcrumbSeparator />
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbLink asChild>
|
||||
<Link href={route('memes.index')}>Meme Library</Link>
|
||||
</BreadcrumbLink>
|
||||
</BreadcrumbItem>
|
||||
<BreadcrumbSeparator />
|
||||
<BreadcrumbItem>
|
||||
<BreadcrumbPage>{meme.name}</BreadcrumbPage>
|
||||
</BreadcrumbItem>
|
||||
</BreadcrumbList>
|
||||
</Breadcrumb>
|
||||
</div>
|
||||
|
||||
<div className="w-full">
|
||||
<div className="container mx-auto mb-6 space-y-2 px-4 text-center">
|
||||
<h1 className="text-foreground text-3xl font-bold">{meme.name} Meme</h1>
|
||||
<h2 className="text-muted-foreground">
|
||||
Use our video meme editor to customise your {meme.name} meme and export as MP4 video in minutes!
|
||||
</h2>
|
||||
</div>
|
||||
{isClient && Editor ? (
|
||||
<Editor
|
||||
setInitialMeme={(setMeme) => setMeme(meme)}
|
||||
//setInitialBackground={(setBackground) => setBackground(null)}
|
||||
setInitialText={(setText) => setText('add your meme caption here')}
|
||||
/>
|
||||
) : (
|
||||
<div className="flex h-96 items-center justify-center text-center">
|
||||
<div className="space-y-2">
|
||||
<Spinner />
|
||||
<div className="text-muted-foreground" data-nosnippet>
|
||||
Loading meme video editor...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="container mx-auto grid justify-center gap-5 lg:grid-cols-1" id="more-info">
|
||||
<div className="">
|
||||
{/* Keywords */}
|
||||
<Card className="h-auto">
|
||||
<CardHeader>
|
||||
<CardTitle className="text-lg">Know Your Meme</CardTitle>
|
||||
<CardDescription className="hidden"></CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<b>Description: </b>
|
||||
{meme.description && (
|
||||
<div className="mb-4">
|
||||
<p className="text-muted-foreground text-sm leading-relaxed">{meme.description}</p>
|
||||
</div>
|
||||
)}
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{allKeywords.map((keyword, index) => (
|
||||
<KeywordBadge key={index} keyword={keyword} />
|
||||
))}
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
{/* Related Memes */}
|
||||
<div className="">
|
||||
{relatedMemes.length > 0 && (
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle className="text-lg">Related Memes</CardTitle>
|
||||
<CardDescription>Similar meme templates you might like</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<div className="xs:grid-cols-2 mb-8 grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6">
|
||||
{relatedMemes.map((related) => (
|
||||
<MemeCard key={related.ids} meme={related} showKeywords={false} />
|
||||
))}
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Back to Meme Library Button */}
|
||||
<div className="mt-8 text-center">
|
||||
<Link href={route('memes.index')}>
|
||||
<Button variant="outline" size="lg" className="gap-2">
|
||||
<ArrowLeft className="h-4 w-4" />
|
||||
Back to Meme Library
|
||||
</Button>
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
<Footer />
|
||||
{/* <AuthUser /> */}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -20,6 +20,11 @@ const useMediaStore = create(
|
||||
currentCaption: 'I am chicken rice',
|
||||
watermarked: true,
|
||||
|
||||
// Initial values state
|
||||
hasInitialMeme: false,
|
||||
hasInitialBackground: false,
|
||||
hasInitialText: false,
|
||||
|
||||
keywords: [],
|
||||
isLoadingAIHints: false,
|
||||
|
||||
@@ -57,6 +62,28 @@ const useMediaStore = create(
|
||||
set({ currentCaption: caption });
|
||||
},
|
||||
|
||||
// Set initial values from props
|
||||
setInitialMeme: (meme) => {
|
||||
set({ selectedMeme: meme, hasInitialMeme: true });
|
||||
},
|
||||
|
||||
setInitialBackground: (background) => {
|
||||
set({ selectedBackground: background, hasInitialBackground: true });
|
||||
},
|
||||
|
||||
setInitialText: (text) => {
|
||||
set({ currentCaption: text, hasInitialText: true });
|
||||
},
|
||||
|
||||
// Clear initial state to allow fresh initialization
|
||||
clearInitialState: () => {
|
||||
set({
|
||||
hasInitialMeme: false,
|
||||
hasInitialBackground: false,
|
||||
hasInitialText: false
|
||||
});
|
||||
},
|
||||
|
||||
// Clear selections
|
||||
clearSelectedMeme: () => {
|
||||
set({ selectedMeme: null });
|
||||
@@ -107,15 +134,31 @@ const useMediaStore = create(
|
||||
},
|
||||
|
||||
init: async () => {
|
||||
const state = get();
|
||||
|
||||
// Skip API call completely if ALL initial values were set via props
|
||||
if (state.hasInitialMeme && state.hasInitialBackground && state.hasInitialText) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await axiosInstance.post(route('api.app.init'));
|
||||
|
||||
if (response?.data?.success?.data?.init) {
|
||||
set({
|
||||
currentCaption: response.data.success.data.init.caption,
|
||||
selectedMeme: response.data.success.data.init.meme,
|
||||
selectedBackground: response.data.success.data.init.background,
|
||||
});
|
||||
const updates = {};
|
||||
|
||||
// Only update values that weren't set via props
|
||||
if (!state.hasInitialText) {
|
||||
updates.currentCaption = response.data.success.data.init.caption;
|
||||
}
|
||||
if (!state.hasInitialMeme) {
|
||||
updates.selectedMeme = response.data.success.data.init.meme;
|
||||
}
|
||||
if (!state.hasInitialBackground) {
|
||||
updates.selectedBackground = response.data.success.data.init.background;
|
||||
}
|
||||
|
||||
set(updates);
|
||||
} else {
|
||||
throw 'Invalid API response';
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
45
resources/markdown/dmca-copyright.md
Normal file
45
resources/markdown/dmca-copyright.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# DMCA Copyright Policy
|
||||
|
||||
**Last updated: July 17, 2025**
|
||||
|
||||
MEMEFA.ST ("We") has adopted the following general policy toward copyright infringement in accordance with the Digital Millennium Copyright Act (DMCA). The address of the Designated Agent to Receive Notification of Claimed Infringement ("Designated Agent") is listed at the end of this policy.
|
||||
|
||||
## Procedure for Reporting Copyright Infringement
|
||||
|
||||
If you believe that material or content residing on or accessible through our websites or services infringes a copyright, please send a notice of copyright infringement containing the following information to the Designated Agent listed below:
|
||||
|
||||
1. A physical or electronic signature of a person authorized to act on behalf of the owner of the copyright that has been allegedly infringed;
|
||||
2. Identification of works or materials being infringed;
|
||||
3. Identification of the material that is claimed to be infringing including information regarding the location of the infringing materials that the copyright owner seeks to have removed, with sufficient detail so that we are capable of finding and verifying its existence;
|
||||
4. Contact information about the notifier including address, telephone number, and, if available, e-mail address;
|
||||
5. A statement that the notifier has a good faith belief that the material is not authorized by the copyright owner, its agent, or the law; and
|
||||
6. A statement made under penalty of perjury that the information provided is accurate and the notifying party is authorized to make the complaint on behalf of the copyright owner.
|
||||
|
||||
## Procedure to Deliver Counter-Notice
|
||||
|
||||
If any user believes any material removed is either not infringing or that such user has the right to post and use such material from the copyright owner, the copyright owner's agent, or pursuant to the law, the user must send a counter-notice containing the following information to the Designated Agent listed below:
|
||||
|
||||
1. A physical or electronic signature of the user;
|
||||
2. Identification of the material that has been removed and the location at which the material appeared before it was removed;
|
||||
3. A statement that the user has a good faith belief that the material was removed as a result of mistake or a misidentification of the material; and
|
||||
4. The user's name, address, telephone number, and, if available, e-mail address and a statement that such person or entity consents to the jurisdiction of the Federal Court for the judicial district in which the user's address is located, or if the user's address is located outside the United States, for any judicial district in which we are located, and that such person or entity will accept service of process from the person who provided notification of the alleged infringement.
|
||||
|
||||
If a counter-notice is received by the Designated Agent, we will forward a copy of the counter-notice to the original complaining party informing that person that we may restore the removed material within 10 days. The original complaining party will then have 10 days to notify us that he or she has filed legal action relating to the allegedly infringing material. If we do not receive any such notification within 10 days, we may restore the material, at our discretion.
|
||||
|
||||
## Disclaimer
|
||||
|
||||
It is essential to understand that we are not your lawyers and cannot give you advice or represent you in any way. By using MEMEFA.ST's services, you acknowledge that you are bound by the terms and conditions and are wholly responsible for your own actions. Should you find yourself in receipt of a DMCA notice or be accused of infringing someone's copyright, you should act accordingly or seek legal counsel of your own accord.
|
||||
|
||||
In accordance with our terms and conditions, we reserve the right to remove content without notice for any reason we see fit.
|
||||
|
||||
## Learn More About DMCA
|
||||
|
||||
For more information on DMCA, refer to the following:
|
||||
|
||||
- [Digital Millennium Copyright Act on Wikipedia](https://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act)
|
||||
- [Official DMCA Legislation Document](https://www.copyright.gov/legislation/dmca.pdf)
|
||||
- [Copyright.gov DMCA Information](https://www.copyright.gov/dmca/)
|
||||
|
||||
## Designated Agent to Receive Notification of Claimed Infringement
|
||||
|
||||
Please contact our Designated Agent at **contact@memefa.st**.
|
||||
@@ -1,25 +1,25 @@
|
||||
# Privacy Policy
|
||||
|
||||
Updated at 2024-10-15
|
||||
Updated at 2025-07-17
|
||||
|
||||
MEMEFAST or our initials MEMEFAST (“we,” “our,” or “us”) is committed to protecting your privacy. This Privacy Policy explains how your personal information is collected, used, and disclosed by MEMEFAST.
|
||||
MEMEFA.ST or our initials MEMEFA.ST (“we,” “our,” or “us”) is committed to protecting your privacy. This Privacy Policy explains how your personal information is collected, used, and disclosed by MEMEFA.ST.
|
||||
|
||||
This Privacy Policy applies to our application, website, and its associated subdomains (collectively, our “Service”) alongside our application, MEMEFAST. By accessing or using our Service, you signify that you have read, understood, and agree to our collection, storage, use, and disclosure of your personal information as described in this Privacy Policy and our Terms of Service.
|
||||
This Privacy Policy applies to our application, website, and its associated subdomains (collectively, our “Service”) alongside our application, MEMEFA.ST. By accessing or using our Service, you signify that you have read, understood, and agree to our collection, storage, use, and disclosure of your personal information as described in this Privacy Policy and our Terms of Service.
|
||||
|
||||
## Definitions and key terms
|
||||
|
||||
To help explain things as clearly as possible in this Privacy Policy, every time any of these terms are referenced, are strictly defined as:
|
||||
|
||||
- Cookie: small amount of data generated by a website and saved by your web browser. It is used to identify your browser, provide analytics, remember information about you such as your language preference or login information.
|
||||
- Company: when this policy mentions “Company,” “we,” “us,” or “our,” it refers to MEMEFAST that is responsible for your information under this Privacy Policy.
|
||||
- Customer: refers to the company, organization or person that signs up to use the MEMEFAST Service to manage the relationships with your consumers or service users.
|
||||
- Device: any internet connected device such as a phone, tablet, computer or any other device that can be used to visit MEMEFAST and use the services.
|
||||
- We/Our/Us: when this policy mentions "we," "us," or "our," it refers to MEMEFA.ST that is responsible for your information under this Privacy Policy.
|
||||
- Customer: refers to the company, organization or person that signs up to use the MEMEFA.ST Service to manage the relationships with your consumers or service users.
|
||||
- Device: any internet connected device such as a phone, tablet, computer or any other device that can be used to visit MEMEFA.ST and use the services.
|
||||
- IP address: Every device connected to the Internet is assigned a number known as an Internet protocol (IP) address. These numbers are usually assigned in geographic blocks. An IP address can often be used to identify the location from which a device is connecting to the Internet.
|
||||
- Personnel: refers to those individuals who are employed by MEMEFAST or are under contract to perform a service on behalf of one of the parties.
|
||||
- Personnel: refers to those individuals who are employed by MEMEFA.ST or are under contract to perform a service on behalf of one of the parties.
|
||||
- Personal Data: any information that directly, indirectly, or in connection with other information — including a personal identification number — allows for the identification or identifiability of a natural person.
|
||||
- Service: refers to the service provided by MEMEFAST as described in the relative terms (if available) and on this platform.
|
||||
- Service: refers to the service provided by MEMEFA.ST as described in the relative terms (if available) and on this platform.
|
||||
- Third-party service: refers to advertisers, contest sponsors, promotional and marketing partners, and others who provide our content or whose products or services we think may interest you.
|
||||
- Website: MEMEFAST’s site, - You: a person or entity that is registered with MEMEFAST to use the Services.
|
||||
- Website: MEMEFA.ST’s site, - You: a person or entity that is registered with MEMEFA.ST to use the Services.
|
||||
|
||||
## What Information Do We Collect?
|
||||
|
||||
@@ -40,15 +40,15 @@ ## How Do We Use The Information We Collect?
|
||||
- To administer a contest, promotion, survey or other site feature
|
||||
- To send periodic emails
|
||||
|
||||
## When does MEMEFAST use end user information from third parties?
|
||||
## When does MEMEFA.ST use end user information from third parties?
|
||||
|
||||
MEMEFAST will collect End User Data necessary to provide the MEMEFAST services to our customers.
|
||||
MEMEFA.ST will collect End User Data necessary to provide the MEMEFA.ST services to our customers.
|
||||
|
||||
End users may voluntarily provide us with information they have made available on social media websites. If you provide us with any such information, we may collect publicly available information from the social media websites you have indicated. You can control how much of your information social media websites make public by visiting these websites and changing your privacy settings.
|
||||
|
||||
## When does MEMEFAST use customer information from third parties?
|
||||
## When does MEMEFA.ST use customer information from third parties?
|
||||
|
||||
We receive some information from the third parties when you contact us. For example, when you submit your email address to us to show interest in becoming a MEMEFAST customer, we receive information from a third party that provides automated fraud detection services to MEMEFAST. We also occasionally collect information that is made publicly available on social media websites. You can control how much of your information social media websites make public by visiting these websites and changing your privacy settings.
|
||||
We receive some information from the third parties when you contact us. For example, when you submit your email address to us to show interest in becoming a MEMEFA.ST customer, we receive information from a third party that provides automated fraud detection services to MEMEFA.ST. We also occasionally collect information that is made publicly available on social media websites. You can control how much of your information social media websites make public by visiting these websites and changing your privacy settings.
|
||||
|
||||
## Do we share the information we collect with third parties?
|
||||
|
||||
@@ -64,7 +64,7 @@ ## Do we share the information we collect with third parties?
|
||||
|
||||
## Where and when is information collected from customers and end users?
|
||||
|
||||
MEMEFAST will collect personal information that you submit to us. We may also receive personal information about you from third parties as described above.
|
||||
MEMEFA.ST will collect personal information that you submit to us. We may also receive personal information about you from third parties as described above.
|
||||
|
||||
## How Do We Use Your Email Address?
|
||||
|
||||
@@ -72,23 +72,23 @@ ## How Do We Use Your Email Address?
|
||||
|
||||
## How Long Do We Keep Your Information?
|
||||
|
||||
We keep your information only so long as we need it to provide MEMEFAST to you and fulfill the purposes described in this policy. This is also the case for anyone that we share your information with and who carries out services on our behalf. When we no longer need to use your information and there is no need for us to keep it to comply with our legal or regulatory obligations, we’ll either remove it from our systems or depersonalize it so that we can't identify you.
|
||||
We keep your information only so long as we need it to provide MEMEFA.ST to you and fulfill the purposes described in this policy. This is also the case for anyone that we share your information with and who carries out services on our behalf. When we no longer need to use your information and there is no need for us to keep it to comply with our legal or regulatory obligations, we’ll either remove it from our systems or depersonalize it so that we can't identify you.
|
||||
|
||||
## How Do We Protect Your Information?
|
||||
|
||||
We implement a variety of security measures to maintain the safety of your personal information when you place an order or enter, submit, or access your personal information. We offer the use of a secure server. All supplied sensitive/credit information is transmitted via Secure Socket Layer (SSL) technology and then encrypted into our Payment gateway providers database only to be accessible by those authorized with special access rights to such systems, and are required to keep the information confidential. After a transaction, your private information (credit cards, social security numbers, financials, etc.) is never kept on file. We cannot, however, ensure or warrant the absolute security of any information you transmit to MEMEFAST or guarantee that your information on the Service may not be accessed, disclosed, altered, or destroyed by a breach of any of our physical, technical, or managerial safeguards.
|
||||
We implement a variety of security measures to maintain the safety of your personal information when you place an order or enter, submit, or access your personal information. We offer the use of a secure server. All supplied sensitive/credit information is transmitted via Secure Socket Layer (SSL) technology and then encrypted into our Payment gateway providers database only to be accessible by those authorized with special access rights to such systems, and are required to keep the information confidential. After a transaction, your private information (credit cards, social security numbers, financials, etc.) is never kept on file. We cannot, however, ensure or warrant the absolute security of any information you transmit to MEMEFA.ST or guarantee that your information on the Service may not be accessed, disclosed, altered, or destroyed by a breach of any of our physical, technical, or managerial safeguards.
|
||||
|
||||
## Could my information be transferred to other countries?
|
||||
|
||||
Information collected via our website, through direct interactions with you, or from use of our help services may be transferred from time to time to our offices or personnel, or to third parties, located throughout the world, and may be viewed and hosted anywhere in the world, including countries that may not have laws of general applicability regulating the use and transfer of such data. To the fullest extent allowed by applicable law, by using any of the above, you voluntarily consent to the trans-border transfer and hosting of such information.
|
||||
|
||||
## Is the information collected through the MEMEFAST Service secure?
|
||||
## Is the information collected through the MEMEFA.ST Service secure?
|
||||
|
||||
We take precautions to protect the security of your information. We have physical, electronic, and managerial procedures to help safeguard, prevent unauthorized access, maintain data security, and correctly use your information. However, neither people nor security systems are foolproof, including encryption systems. In addition, people can commit intentional crimes, make mistakes or fail to follow policies. Therefore, while we use reasonable efforts to protect your personal information, we cannot guarantee its absolute security. If applicable law imposes any non-disclaimable duty to protect your personal information, you agree that intentional misconduct will be the standards used to measure our compliance with that duty.
|
||||
|
||||
## Can I update or correct my information?
|
||||
|
||||
The rights you have to request updates or corrections to the information MEMEFAST collects depend on your relationship with MEMEFAST. Personnel may update or correct their information as detailed in our internal company employment policies.
|
||||
The rights you have to request updates or corrections to the information MEMEFA.ST collects depend on your relationship with MEMEFA.ST. Personnel may update or correct their information as detailed in our internal company employment policies.
|
||||
|
||||
Customers have the right to request the restriction of certain uses and disclosures of personally identifiable information as follows. You can contact us in order to (1) update or correct your personally identifiable information, (2) change your preferences with respect to communications and other information you receive from us, or (3) delete the personally identifiable information maintained about you on our systems (subject to the following paragraph), by cancelling your account. Such updates, corrections, changes and deletions will have no effect on other information that we maintain, or information that we have provided to third parties in accordance with this Privacy Policy prior to such update, correction, change or deletion. To protect your privacy and security, we may take reasonable steps (such as requesting a unique password) to verify your identity before granting you profile access or making corrections. You are responsible for maintaining the secrecy of your unique password and account information at all times.
|
||||
|
||||
@@ -98,17 +98,17 @@ ## Can I update or correct my information?
|
||||
|
||||
## Personnel
|
||||
|
||||
If you are a MEMEFAST worker or applicant, we collect information you voluntarily provide to us. We use the information collected for Human Resources purposes in order to administer benefits to workers and screen applicants.
|
||||
If you are a MEMEFA.ST worker or applicant, we collect information you voluntarily provide to us. We use the information collected for Human Resources purposes in order to administer benefits to workers and screen applicants.
|
||||
|
||||
You may contact us in order to (1) update or correct your information, (2) change your preferences with respect to communications and other information you receive from us, or (3) receive a record of the information we have relating to you. Such updates, corrections, changes and deletions will have no effect on other information that we maintain, or information that we have provided to third parties in accordance with this Privacy Policy prior to such update, correction, change or deletion.
|
||||
|
||||
## Sale of Business
|
||||
|
||||
We reserve the right to transfer information to a third party in the event of a sale, merger or other transfer of all or substantially all of the assets of MEMEFAST or any of its Corporate Affiliates (as defined herein), or that portion of MEMEFAST or any of its Corporate Affiliates to which the Service relates, or in the event that we discontinue our business or file a petition or have filed against us a petition in bankruptcy, reorganization or similar proceeding, provided that the third party agrees to adhere to the terms of this Privacy Policy.
|
||||
We reserve the right to transfer information to a third party in the event of a sale, merger or other transfer of all or substantially all of the assets of MEMEFA.ST or any of its Corporate Affiliates (as defined herein), or that portion of MEMEFA.ST or any of its Corporate Affiliates to which the Service relates, or in the event that we discontinue our business or file a petition or have filed against us a petition in bankruptcy, reorganization or similar proceeding, provided that the third party agrees to adhere to the terms of this Privacy Policy.
|
||||
|
||||
## Affiliates
|
||||
|
||||
We may disclose information (including personal information) about you to our Corporate Affiliates. For purposes of this Privacy Policy, "Corporate Affiliate" means any person or entity which directly or indirectly controls, is controlled by or is under common control with MEMEFAST, whether by ownership or otherwise. Any information relating to you that we provide to our Corporate Affiliates will be treated by those Corporate Affiliates in accordance with the terms of this Privacy Policy.
|
||||
We may disclose information (including personal information) about you to our Corporate Affiliates. For purposes of this Privacy Policy, "Corporate Affiliate" means any person or entity which directly or indirectly controls, is controlled by or is under common control with MEMEFA.ST, whether by ownership or otherwise. Any information relating to you that we provide to our Corporate Affiliates will be treated by those Corporate Affiliates in accordance with the terms of this Privacy Policy.
|
||||
|
||||
## Governing Law
|
||||
|
||||
@@ -116,7 +116,7 @@ ## Governing Law
|
||||
|
||||
The laws of Malaysia, excluding its conflicts of law rules, shall govern this Agreement and your use of the website. Your use of the website may also be subject to other local, state, national, or international laws.
|
||||
|
||||
By using MEMEFAST or contacting us directly, you signify your acceptance of this Privacy Policy. If you do not agree to this Privacy Policy, you should not engage with our website, or use our services. Continued use of the website, direct engagement with us, or following the posting of changes to this Privacy Policy that do not significantly affect the use or disclosure of your personal information will mean that you accept those changes.
|
||||
By using MEMEFA.ST or contacting us directly, you signify your acceptance of this Privacy Policy. If you do not agree to this Privacy Policy, you should not engage with our website, or use our services. Continued use of the website, direct engagement with us, or following the posting of changes to this Privacy Policy that do not significantly affect the use or disclosure of your personal information will mean that you accept those changes.
|
||||
|
||||
## Your Consent
|
||||
|
||||
@@ -124,15 +124,15 @@ ## Your Consent
|
||||
|
||||
## Links to Other Websites
|
||||
|
||||
This Privacy Policy applies only to the Services. The Services may contain links to other websites not operated or controlled by MEMEFAST. We are not responsible for the content, accuracy or opinions expressed in such websites, and such websites are not investigated, monitored or checked for accuracy or completeness by us. Please remember that when you use a link to go from the Services to another website, our Privacy Policy is no longer in effect. Your browsing and interaction on any other website, including those that have a link on our platform, is subject to that website’s own rules and policies. Such third parties may use their own cookies or other methods to collect information about you.
|
||||
This Privacy Policy applies only to the Services. The Services may contain links to other websites not operated or controlled by MEMEFA.ST. We are not responsible for the content, accuracy or opinions expressed in such websites, and such websites are not investigated, monitored or checked for accuracy or completeness by us. Please remember that when you use a link to go from the Services to another website, our Privacy Policy is no longer in effect. Your browsing and interaction on any other website, including those that have a link on our platform, is subject to that website’s own rules and policies. Such third parties may use their own cookies or other methods to collect information about you.
|
||||
|
||||
## Advertising
|
||||
|
||||
This website may contain third party advertisements and links to third party sites. MEMEFAST does not make any representation as to the accuracy or suitability of any of the information contained in those advertisements or sites and does not accept any responsibility or liability for the conduct or content of those advertisements and sites and the offerings made by the third parties.
|
||||
This website may contain third party advertisements and links to third party sites. MEMEFA.ST does not make any representation as to the accuracy or suitability of any of the information contained in those advertisements or sites and does not accept any responsibility or liability for the conduct or content of those advertisements and sites and the offerings made by the third parties.
|
||||
|
||||
Advertising keeps MEMEFAST and many of the websites and services you use free of charge. We work hard to make sure that ads are safe, unobtrusive, and as relevant as possible.
|
||||
Advertising keeps MEMEFA.ST and many of the websites and services you use free of charge. We work hard to make sure that ads are safe, unobtrusive, and as relevant as possible.
|
||||
|
||||
Third party advertisements and links to other sites where goods or services are advertised are not endorsements or recommendations by MEMEFAST of the third party sites, goods or services. MEMEFAST takes no responsibility for the content of any of the ads, promises made, or the quality/reliability of the products or services offered in all advertisements.
|
||||
Third party advertisements and links to other sites where goods or services are advertised are not endorsements or recommendations by MEMEFA.ST of the third party sites, goods or services. MEMEFA.ST takes no responsibility for the content of any of the ads, promises made, or the quality/reliability of the products or services offered in all advertisements.
|
||||
|
||||
## Cookies for Advertising
|
||||
|
||||
@@ -140,7 +140,7 @@ ## Cookies for Advertising
|
||||
|
||||
## Cookies
|
||||
|
||||
MEMEFAST uses "Cookies" to identify the areas of our website that you have visited. A Cookie is a small piece of data stored on your computer or mobile device by your web browser. We use Cookies to enhance the performance and functionality of our website but are non-essential to their use. However, without these cookies, certain functionality like videos may become unavailable or you would be required to enter your login details every time you visit the website as we would not be able to remember that you had logged in previously. Most web browsers can be set to disable the use of Cookies. However, if you disable Cookies, you may not be able to access functionality on our website correctly or at all. We never place Personally Identifiable Information in Cookies.
|
||||
MEMEFA.ST uses "Cookies" to identify the areas of our website that you have visited. A Cookie is a small piece of data stored on your computer or mobile device by your web browser. We use Cookies to enhance the performance and functionality of our website but are non-essential to their use. However, without these cookies, certain functionality like videos may become unavailable or you would be required to enter your login details every time you visit the website as we would not be able to remember that you had logged in previously. Most web browsers can be set to disable the use of Cookies. However, if you disable Cookies, you may not be able to access functionality on our website correctly or at all. We never place Personally Identifiable Information in Cookies.
|
||||
|
||||
## Blocking and disabling cookies and similar technologies
|
||||
|
||||
@@ -165,18 +165,18 @@ ## Changes To Our Privacy Policy
|
||||
## Third-Party Services
|
||||
|
||||
We may display, include or make available third-party content (including data, information, applications and other products services) or provide links to third-party websites or services ("Third- Party Services").
|
||||
You acknowledge and agree that MEMEFAST shall not be responsible for any Third-Party Services, including their accuracy, completeness, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect thereof.
|
||||
You acknowledge and agree that MEMEFA.ST shall not be responsible for any Third-Party Services, including their accuracy, completeness, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect thereof.
|
||||
|
||||
MEMEFAST does not assume and shall not have any liability or responsibility to you or any other person or entity for any Third-Party Services. Third-Party Services and links thereto are provided solely as a convenience to you and you access and use them entirely at your own risk and subject to such third parties' terms and conditions. We encourage you to review their terms of service and privacy policies:
|
||||
MEMEFA.ST does not assume and shall not have any liability or responsibility to you or any other person or entity for any Third-Party Services. Third-Party Services and links thereto are provided solely as a convenience to you and you access and use them entirely at your own risk and subject to such third parties' terms and conditions. We encourage you to review their terms of service and privacy policies:
|
||||
|
||||
- [Google Privacy Policy](https://policies.google.com/privacy) and [Google Terms of Service](https://policies.google.com/terms)
|
||||
- [Meta Pixel Terms and Policies](https://developers.facebook.com/docs/meta-pixel/guides/terms-and-policies/)
|
||||
|
||||
## Google API Limited Use Disclosure
|
||||
|
||||
MEMEFAST uses Google APIs when you use your Google account to sign in.
|
||||
MEMEFA.ST uses Google APIs when you use your Google account to sign in.
|
||||
|
||||
MEMEFAST's use and transfer to any other app of information received from Google APIs will adhere to [Google API Services User Data Policy](https://developers.google.com/terms/api-services-user-data-policy#additional_requirements_for_specific_api_scopes), including the Limited Use requirements.
|
||||
MEMEFA.ST's use and transfer to any other app of information received from Google APIs will adhere to [Google API Services User Data Policy](https://developers.google.com/terms/api-services-user-data-policy#additional_requirements_for_specific_api_scopes), including the Limited Use requirements.
|
||||
|
||||
## Meta Pixel
|
||||
|
||||
@@ -194,7 +194,7 @@ ## Tracking Technologies
|
||||
|
||||
- Sessions
|
||||
|
||||
MEMEFAST uses "Sessions" to identify the areas of our website that you have visited. A Session is a small piece of data stored on your computer or mobile device by your web browser.
|
||||
MEMEFA.ST uses "Sessions" to identify the areas of our website that you have visited. A Session is a small piece of data stored on your computer or mobile device by your web browser.
|
||||
|
||||
## Information about General Data Protection Regulation (GDPR)
|
||||
|
||||
@@ -219,11 +219,11 @@ ### What is personal data?
|
||||
|
||||
### Why is GDPR important?
|
||||
|
||||
GDPR adds some new requirements regarding how companies should protect individuals' personal data that they collect and process. It also raises the stakes for compliance by increasing enforcement and imposing greater fines for breach. Beyond these facts it's simply the right thing to do. At MEMEFAST we strongly believe that your data privacy is very important and we already have solid security and privacy practices in place that go beyond the requirements of this new regulation.
|
||||
GDPR adds some new requirements regarding how companies should protect individuals' personal data that they collect and process. It also raises the stakes for compliance by increasing enforcement and imposing greater fines for breach. Beyond these facts it's simply the right thing to do. At MEMEFA.ST we strongly believe that your data privacy is very important and we already have solid security and privacy practices in place that go beyond the requirements of this new regulation.
|
||||
|
||||
### Individual Data Subject's Rights - Data Access, Portability and Deletion
|
||||
|
||||
We are committed to helping our customers meet the data subject rights requirements of GDPR. MEMEFAST processes or stores all personal data in fully vetted, DPA compliant vendors. We do store all conversation and personal data for up to 6 years unless your account is deleted. In which case, we dispose of all data in accordance with our Terms of Service and Privacy Policy, but we will not hold it longer than 60 days.
|
||||
We are committed to helping our customers meet the data subject rights requirements of GDPR. MEMEFA.ST processes or stores all personal data in fully vetted, DPA compliant vendors. We do store all conversation and personal data for up to 6 years unless your account is deleted. In which case, we dispose of all data in accordance with our Terms of Service and Privacy Policy, but we will not hold it longer than 60 days.
|
||||
|
||||
We are aware that if you are working with EU customers, you need to be able to provide them with the ability to access, update, retrieve and remove personal data. We got you! We've been set up as self service from the start and have always given you access to your data and your customers data. Our customer support team is here for you to answer any questions you might have about working with the API.
|
||||
|
||||
@@ -246,4 +246,4 @@ ## Contact Us
|
||||
|
||||
Don't hesitate to contact us if you have any questions.
|
||||
|
||||
-Via Email: memefa.st@gmail.com
|
||||
-Via Email: contact@memefa.st
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
# Terms & Conditions
|
||||
|
||||
Updated at 2024-10-15
|
||||
Updated at 2025-07-17
|
||||
|
||||
## General Terms
|
||||
|
||||
By accessing and placing an order with MEMEFAST, you confirm that you are in agreement with and bound by the terms of service contained in the Terms & Conditions outlined below. These terms apply to the entire website and any email or other type of communication between you and MEMEFAST.
|
||||
By accessing and placing an order with MEMEFA.ST, you confirm that you are in agreement with and bound by the terms of service contained in the Terms & Conditions outlined below. These terms apply to the entire website and any email or other type of communication between you and MEMEFA.ST.
|
||||
|
||||
Under no circumstances shall MEMEFAST team be liable for any direct, indirect, special, incidental or consequential damages, including, but not limited to, loss of data or profit, arising out of the use, or the inability to use, the materials on this site, even if MEMEFAST team or an authorized representative has been advised of the possibility of such damages. If your use of materials from this site results in the need for servicing, repair or correction of equipment or data, you assume any costs thereof.
|
||||
Under no circumstances shall MEMEFA.ST team be liable for any direct, indirect, special, incidental or consequential damages, including, but not limited to, loss of data or profit, arising out of the use, or the inability to use, the materials on this site, even if MEMEFA.ST team or an authorized representative has been advised of the possibility of such damages. If your use of materials from this site results in the need for servicing, repair or correction of equipment or data, you assume any costs thereof.
|
||||
|
||||
MEMEFAST will not be responsible for any outcome that may occur during the course of usage of our resources. We reserve the rights to change prices and revise the resources usage policy in any moment.
|
||||
MEMEFA.ST will not be responsible for any outcome that may occur during the course of usage of our resources. We reserve the rights to change prices and revise the resources usage policy in any moment.
|
||||
|
||||
## License
|
||||
|
||||
MEMEFAST grants you a revocable, non-exclusive, non-transferable, limited license to download, install and use the website strictly in accordance with the terms of this Agreement.
|
||||
MEMEFA.ST grants you a revocable, non-exclusive, non-transferable, limited license to download, install and use the website strictly in accordance with the terms of this Agreement.
|
||||
|
||||
These Terms & Conditions are a contract between you and MEMEFAST (referred to in these Terms & Conditions as "MEMEFAST", "us", "we" or "our"), the provider of the MEMEFAST website and the services accessible from the MEMEFAST website (which are collectively referred to in these Terms & Conditions as the "MEMEFAST Service").
|
||||
These Terms & Conditions are a contract between you and MEMEFA.ST (referred to in these Terms & Conditions as "MEMEFA.ST", "us", "we" or "our"), the provider of the MEMEFA.ST website and the services accessible from the MEMEFA.ST website (which are collectively referred to in these Terms & Conditions as the "MEMEFA.ST Service").
|
||||
|
||||
You are agreeing to be bound by these Terms & Conditions. If you do not agree to these Terms & Conditions, please do not use the MEMEFAST Service. In these Terms & Conditions, "you" refers both to you as an individual and to the entity you represent. If you violate any of these Terms & Conditions, we reserve the right to cancel your account or block access to your account without notice.
|
||||
You are agreeing to be bound by these Terms & Conditions. If you do not agree to these Terms & Conditions, please do not use the MEMEFA.ST Service. In these Terms & Conditions, "you" refers both to you as an individual and to the entity you represent. If you violate any of these Terms & Conditions, we reserve the right to cancel your account or block access to your account without notice.
|
||||
|
||||
## Meanings
|
||||
|
||||
For this Terms & Conditions:
|
||||
|
||||
- Cookie: small amount of data generated by a website and saved by your web browser. It is used to identify your browser, provide analytics, remember information about you such as your language preference or login information.
|
||||
- Company: when this policy mentions “Company,” “we,” “us,” or “our,” it refers to MEMEFAST, that is responsible for your information under this Terms & Conditions.
|
||||
- Device: any internet connected device such as a phone, tablet, computer or any other device that can be used to visit MEMEFAST and use the services.
|
||||
- Service: refers to the service provided by MEMEFAST as described in the relative terms (if available) and on this platform.
|
||||
- We/Our/Us: when this policy mentions "we," "us," or "our," it refers to MEMEFA.ST, that is responsible for your information under this Terms & Conditions.
|
||||
- Device: any internet connected device such as a phone, tablet, computer or any other device that can be used to visit MEMEFA.ST and use the services.
|
||||
- Service: refers to the service provided by MEMEFA.ST as described in the relative terms (if available) and on this platform.
|
||||
- Third-party service: refers to advertisers, contest sponsors, promotional and marketing partners, and others who provide our content or whose products or services we think may interest you.
|
||||
- Website: MEMEFAST."’s" site, which can be accessed via this URL: memefa.st
|
||||
- You: a person or entity that is registered with MEMEFAST to use the Services.
|
||||
- Mobile App: MEMEFAST or MEMEFAST app
|
||||
- Website: MEMEFA.ST."’s" site, which can be accessed via this URL: memefa.st
|
||||
- You: a person or entity that is registered with MEMEFA.ST to use the Services.
|
||||
- Mobile App: MEMEFA.ST or MEMEFA.ST app
|
||||
|
||||
## Restrictions
|
||||
|
||||
@@ -37,11 +37,11 @@ ## Restrictions
|
||||
|
||||
- License, sell, rent, lease, assign, distribute, transmit, host, outsource, disclose or otherwise commercially exploit the website or make the platform available to any third party.
|
||||
- Modify, make derivative works of, disassemble, decrypt, reverse compile or reverse engineer any part of the website.
|
||||
- Remove, alter or obscure any proprietary notice (including any notice of copyright or trademark) of MEMEFAST or its affiliates, partners, suppliers or the licensors of the website.
|
||||
- Remove, alter or obscure any proprietary notice (including any notice of copyright or trademark) of MEMEFA.ST or its affiliates, partners, suppliers or the licensors of the website.
|
||||
|
||||
## Billing and Payments
|
||||
|
||||
1. All payments for MEMEFAST services are processed through our third-party payment processor Stripe.
|
||||
1. All payments for MEMEFA.ST services are processed through our third-party payment processor Stripe.
|
||||
2. Accepted Payment Methods: We accept payments via credit card, debit card, and other payment methods supported by Stripe. The available payment methods may vary depending on your location.
|
||||
3. Billing Cycle: Your account will be billed on a [monthly/annual] basis, depending on the plan you choose. The billing date will be set to the day you initially subscribed to our services.
|
||||
4. Automatic Renewal: Your subscription will automatically renew at the end of each billing cycle unless you cancel it before the renewal date.
|
||||
@@ -50,19 +50,19 @@ ## Billing and Payments
|
||||
7. Taxes: All fees and charges are exclusive of applicable taxes, levies, or duties. You are responsible for paying all such taxes, levies, or duties associated with your purchase.
|
||||
8. Currency: All payments will be processed in [specify currency, e.g., USD]. Any currency conversion fees or charges are the responsibility of the customer.
|
||||
9. Discrepancies: If you believe there's an error in your billing, please contact our customer support team within 30 days of the charge date. We will review your claim and make any necessary adjustments.
|
||||
10. Data Security: Your payment information is securely handled by Stripe. MEMEFAST does not store your full credit card information on our servers.
|
||||
10. Data Security: Your payment information is securely handled by Stripe. MEMEFA.ST does not store your full credit card information on our servers.
|
||||
11. Termination: Upon termination of your account, you will be responsible for paying any outstanding balance associated with your use of the services.
|
||||
12. Changes to Billing Terms: We reserve the right to modify these billing terms at any time. We will notify you of any significant changes via email or through our website.
|
||||
|
||||
## Return and Refund Policy
|
||||
|
||||
We provide refunds for MEMEFAST services. If you wish to request a refund, please contact us by our email at memefa.st@gmail.com so we can arrange further assistance. Please prepare your receipt and payment details when contacting us. Once we have reviewed your request and found that no terms have been broken, we can initiate the refund process within 2-3 business days, which will reflect in your bank transaction within 10-15 business days.
|
||||
We provide refunds for MEMEFA.ST services. If you wish to request a refund, please contact us by our email at contact@memefa.st so we can arrange further assistance. Please prepare your receipt and payment details when contacting us. Once we have reviewed your request and found that no terms have been broken, we can initiate the refund process within 2-3 business days, which will reflect in your bank transaction within 10-15 business days.
|
||||
|
||||
## Your Suggestions
|
||||
|
||||
Any feedback, comments, ideas, improvements or suggestions (collectively, "Suggestions") provided by you to MEMEFAST with respect to the website shall remain the sole and exclusive property of MEMEFAST.
|
||||
Any feedback, comments, ideas, improvements or suggestions (collectively, "Suggestions") provided by you to MEMEFA.ST with respect to the website shall remain the sole and exclusive property of MEMEFA.ST.
|
||||
|
||||
MEMEFAST shall be free to use, copy, modify, publish, or redistribute the Suggestions for any purpose and in any way without any credit or any compensation to you.
|
||||
MEMEFA.ST shall be free to use, copy, modify, publish, or redistribute the Suggestions for any purpose and in any way without any credit or any compensation to you.
|
||||
|
||||
## Your Consent
|
||||
|
||||
@@ -70,11 +70,11 @@ ## Your Consent
|
||||
|
||||
## Links to Other Websites
|
||||
|
||||
This Terms & Conditions applies only to the Services. The Services may contain links to other websites not operated or controlled by MEMEFAST. We are not responsible for the content, accuracy or opinions expressed in such websites, and such websites are not investigated, monitored or checked for accuracy or completeness by us. Please remember that when you use a link to go from the Services to another website, our Terms & Conditions are no longer in effect. Your browsing and interaction on any other website, including those that have a link on our platform, is subject to that website’s own rules and policies. Such third parties may use their own cookies or other methods to collect information about you.
|
||||
This Terms & Conditions applies only to the Services. The Services may contain links to other websites not operated or controlled by MEMEFA.ST. We are not responsible for the content, accuracy or opinions expressed in such websites, and such websites are not investigated, monitored or checked for accuracy or completeness by us. Please remember that when you use a link to go from the Services to another website, our Terms & Conditions are no longer in effect. Your browsing and interaction on any other website, including those that have a link on our platform, is subject to that website’s own rules and policies. Such third parties may use their own cookies or other methods to collect information about you.
|
||||
|
||||
## Cookies
|
||||
|
||||
MEMEFAST uses "Cookies" to identify the areas of our website that you have visited. A Cookie is a small piece of data stored on your computer or mobile device by your web browser. We use Cookies to enhance the performance and functionality of our website but are non-essential to their use. However, without these cookies, certain functionality like videos may become unavailable or you would be required to enter your login details every time you visit the website as we would not be able to remember that you had logged in previously. Most web browsers can be set to disable the use of Cookies. However, if you disable Cookies, you may not be able to access functionality on our website correctly or at all. We never place Personally Identifiable Information in Cookies.
|
||||
MEMEFA.ST uses "Cookies" to identify the areas of our website that you have visited. A Cookie is a small piece of data stored on your computer or mobile device by your web browser. We use Cookies to enhance the performance and functionality of our website but are non-essential to their use. However, without these cookies, certain functionality like videos may become unavailable or you would be required to enter your login details every time you visit the website as we would not be able to remember that you had logged in previously. Most web browsers can be set to disable the use of Cookies. However, if you disable Cookies, you may not be able to access functionality on our website correctly or at all. We never place Personally Identifiable Information in Cookies.
|
||||
|
||||
## Site Disclosure
|
||||
|
||||
@@ -82,19 +82,19 @@ ## Site Disclosure
|
||||
|
||||
## Changes To Our Terms & Conditions
|
||||
|
||||
You acknowledge and agree that MEMEFAST may stop (permanently or temporarily) providing the Service (or any features within the Service) to you or to users generally at MEMEFAST’s sole discretion, without prior notice to you. You may stop using the Service at any time. You do not need to specifically inform MEMEFAST when you stop using the Service. You acknowledge and agree that if MEMEFAST disables access to your account, you may be prevented from accessing the Service, your account details or any files or other materials which is contained in your account.
|
||||
You acknowledge and agree that MEMEFA.ST may stop (permanently or temporarily) providing the Service (or any features within the Service) to you or to users generally at MEMEFA.ST’s sole discretion, without prior notice to you. You may stop using the Service at any time. You do not need to specifically inform MEMEFA.ST when you stop using the Service. You acknowledge and agree that if MEMEFA.ST disables access to your account, you may be prevented from accessing the Service, your account details or any files or other materials which is contained in your account.
|
||||
|
||||
If we decide to change our Terms & Conditions, we will post those changes on this page, and/or update the Terms & Conditions modification date below.
|
||||
|
||||
## Modifications to Our website
|
||||
|
||||
MEMEFAST reserves the right to modify, suspend or discontinue, temporarily or permanently, the website or any service to which it connects, with or without notice and without liability to you.
|
||||
MEMEFA.ST reserves the right to modify, suspend or discontinue, temporarily or permanently, the website or any service to which it connects, with or without notice and without liability to you.
|
||||
|
||||
## Updates to Our website
|
||||
|
||||
MEMEFAST may from time to time provide enhancements or improvements to the features/ functionality of the website, which may include patches, bug fixes, updates, upgrades and other modifications ("Updates").
|
||||
MEMEFA.ST may from time to time provide enhancements or improvements to the features/ functionality of the website, which may include patches, bug fixes, updates, upgrades and other modifications ("Updates").
|
||||
|
||||
Updates may modify or delete certain features and/or functionalities of the website. You agree that MEMEFAST has no obligation to (i) provide any Updates, or (ii) continue to provide or enable any particular features and/or functionalities of the website to you.
|
||||
Updates may modify or delete certain features and/or functionalities of the website. You agree that MEMEFA.ST has no obligation to (i) provide any Updates, or (ii) continue to provide or enable any particular features and/or functionalities of the website to you.
|
||||
|
||||
You further agree that all Updates will be (i) deemed to constitute an integral part of the website, and (ii) subject to the terms and conditions of this Agreement.
|
||||
|
||||
@@ -102,44 +102,48 @@ ## Third-Party Services
|
||||
|
||||
We may display, include or make available third-party content (including data, information, applications and other products services) or provide links to third-party websites or services ("Third- Party Services").
|
||||
|
||||
You acknowledge and agree that MEMEFAST shall not be responsible for any Third-Party Services, including their accuracy, completeness, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect thereof. MEMEFAST does not assume and shall not have any liability or responsibility to you or any other person or entity for any Third-Party Services.
|
||||
You acknowledge and agree that MEMEFA.ST shall not be responsible for any Third-Party Services, including their accuracy, completeness, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect thereof. MEMEFA.ST does not assume and shall not have any liability or responsibility to you or any other person or entity for any Third-Party Services.
|
||||
|
||||
Third-Party Services and links thereto are provided solely as a convenience to you and you access and use them entirely at your own risk and subject to such third parties' terms and conditions.
|
||||
|
||||
MEMEFAST utilizes Google API Services. MEMEFAST users are agreeing to be bound by the [Google API Terms of Service](https://developers.google.com/terms) and the [Google Privacy Policy](https://policies.google.com/privacy).x
|
||||
MEMEFA.ST utilizes Google API Services. MEMEFA.ST users are agreeing to be bound by the [Google API Terms of Service](https://developers.google.com/terms) and the [Google Privacy Policy](https://policies.google.com/privacy).x
|
||||
|
||||
## Term and Termination
|
||||
|
||||
This Agreement shall remain in effect until terminated by you or MEMEFAST.
|
||||
This Agreement shall remain in effect until terminated by you or MEMEFA.ST.
|
||||
|
||||
MEMEFAST may, in its sole discretion, at any time and for any or no reason, suspend or terminate this Agreement with or without prior notice.
|
||||
MEMEFA.ST may, in its sole discretion, at any time and for any or no reason, suspend or terminate this Agreement with or without prior notice.
|
||||
|
||||
This Agreement will terminate immediately, without prior notice from MEMEFAST, in the event that you fail to comply with any provision of this Agreement. You may also terminate this Agreement by deleting the website and all copies thereof from your computer.
|
||||
This Agreement will terminate immediately, without prior notice from MEMEFA.ST, in the event that you fail to comply with any provision of this Agreement. You may also terminate this Agreement by deleting the website and all copies thereof from your computer.
|
||||
|
||||
Upon termination of this Agreement, you shall cease all use of the website and delete all copies of the website from your computer.
|
||||
Termination of this Agreement will not limit any of MEMEFAST's rights or remedies at law or in equity in case of breach by you (during the term of this Agreement) of any of your obligations under the present Agreement.
|
||||
Termination of this Agreement will not limit any of MEMEFA.ST's rights or remedies at law or in equity in case of breach by you (during the term of this Agreement) of any of your obligations under the present Agreement.
|
||||
|
||||
## Copyright Infringement Notice
|
||||
|
||||
If you are a copyright owner or such owner’s agent and believe any material on our website constitutes an infringement on your copyright, please contact us setting forth the following information: (a) a physical or electronic signature of the copyright owner or a person authorized to act on his behalf; (b) identification of the material that is claimed to be infringing; (c) your contact information, including your address, telephone number, and an email; (d) a statement by you that you have a good faith belief that use of the material is not authorized by the copyright owners; and (e) the a statement that the information in the notification is accurate, and, under penalty of perjury you are authorized to act on behalf of the owner.
|
||||
We comply with the Digital Millennium Copyright Act (DMCA) and respond to valid copyright infringement notices. For detailed information about our DMCA procedures, please see our [DMCA Copyright Policy](/dmca-copyright).
|
||||
|
||||
If you are a copyright owner or such owner's agent and believe any material on our website constitutes an infringement on your copyright, please contact us setting forth the following information: (a) a physical or electronic signature of the copyright owner or a person authorized to act on his behalf; (b) identification of the material that is claimed to be infringing; (c) your contact information, including your address, telephone number, and an email; (d) a statement by you that you have a good faith belief that use of the material is not authorized by the copyright owners; and (e) the a statement that the information in the notification is accurate, and, under penalty of perjury you are authorized to act on behalf of the owner.
|
||||
|
||||
For formal DMCA notices and counter-notices, please follow the procedures outlined in our [DMCA Copyright Policy](/dmca-copyright).
|
||||
|
||||
## Indemnification
|
||||
|
||||
You agree to indemnify and hold MEMEFAST and its parents, subsidiaries, affiliates, officers, employees, agents, partners and licensors (if any) harmless from any claim or demand, including reasonable attorneys' fees, due to or arising out of your: (a) use of the website; (b) violation of this Agreement or any law or regulation; or (c) violation of any right of a third party.
|
||||
You agree to indemnify and hold MEMEFA.ST and its parents, subsidiaries, affiliates, officers, employees, agents, partners and licensors (if any) harmless from any claim or demand, including reasonable attorneys' fees, due to or arising out of your: (a) use of the website; (b) violation of this Agreement or any law or regulation; or (c) violation of any right of a third party.
|
||||
|
||||
## No Warranties
|
||||
|
||||
The website is provided to you "AS IS" and "AS AVAILABLE" and with all faults and defects without warranty of any kind. To the maximum extent permitted under applicable law, MEMEFAST, on its own behalf and on behalf of its affiliates and its and their respective licensors and service providers, expressly disclaims all warranties, whether express, implied, statutory or otherwise, with respect to the website, including all implied warranties of merchantability, fitness for a particular purpose, title and non-infringement, and warranties that may arise out of course of dealing, course of performance, usage or trade practice. Without limitation to the foregoing, MEMEFAST provides no warranty or undertaking, and makes no representation of any kind that the website will meet your requirements, achieve any intended results, be compatible or work with any other software, , systems or services, operate without interruption, meet any performance or reliability standards or be error free or that any errors or defects can or will be corrected.
|
||||
The website is provided to you "AS IS" and "AS AVAILABLE" and with all faults and defects without warranty of any kind. To the maximum extent permitted under applicable law, MEMEFA.ST, on its own behalf and on behalf of its affiliates and its and their respective licensors and service providers, expressly disclaims all warranties, whether express, implied, statutory or otherwise, with respect to the website, including all implied warranties of merchantability, fitness for a particular purpose, title and non-infringement, and warranties that may arise out of course of dealing, course of performance, usage or trade practice. Without limitation to the foregoing, MEMEFA.ST provides no warranty or undertaking, and makes no representation of any kind that the website will meet your requirements, achieve any intended results, be compatible or work with any other software, , systems or services, operate without interruption, meet any performance or reliability standards or be error free or that any errors or defects can or will be corrected.
|
||||
|
||||
Without limiting the foregoing, neither MEMEFAST nor any MEMEFAST's provider makes any representation or warranty of any kind, express or implied: (i) as to the operation or availability of the website, or the information, content, and materials or products included thereon; (ii) that the website will be uninterrupted or error-free; (iii) as to the accuracy, reliability, or currency of any information or content provided through the website; or (iv) that the website, its servers, the content, or e-mails sent from or on behalf of MEMEFAST are free of viruses, scripts, trojan horses, worms, malware, timebombs or other harmful components.
|
||||
Without limiting the foregoing, neither MEMEFA.ST nor any MEMEFA.ST's provider makes any representation or warranty of any kind, express or implied: (i) as to the operation or availability of the website, or the information, content, and materials or products included thereon; (ii) that the website will be uninterrupted or error-free; (iii) as to the accuracy, reliability, or currency of any information or content provided through the website; or (iv) that the website, its servers, the content, or e-mails sent from or on behalf of MEMEFA.ST are free of viruses, scripts, trojan horses, worms, malware, timebombs or other harmful components.
|
||||
|
||||
Some jurisdictions do not allow the exclusion of or limitations on implied warranties or the limitations on the applicable statutory rights of a consumer, so some or all of the above exclusions and limitations may not apply to you.
|
||||
|
||||
## Limitation of Liability
|
||||
|
||||
Notwithstanding any damages that you might incur, the entire liability of MEMEFAST and any of its suppliers under any provision of this Agreement and your exclusive remedy for all of the foregoing shall be limited to the amount actually paid by you for the website.
|
||||
Notwithstanding any damages that you might incur, the entire liability of MEMEFA.ST and any of its suppliers under any provision of this Agreement and your exclusive remedy for all of the foregoing shall be limited to the amount actually paid by you for the website.
|
||||
|
||||
To the maximum extent permitted by applicable law, in no event shall MEMEFAST or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever (including, but not limited to, damages for loss of profits, for loss of data or other information, for business interruption, for personal injury, for loss of privacy arising out of or in any way related to the use of or inability to use the website, third-party software and/or third-party hardware used with the website, or otherwise in connection with any provision of this Agreement), even if MEMEFAST or any supplier has been advised of the possibility of such damages and even if the remedy fails of its essential purpose.
|
||||
To the maximum extent permitted by applicable law, in no event shall MEMEFA.ST or its suppliers be liable for any special, incidental, indirect, or consequential damages whatsoever (including, but not limited to, damages for loss of profits, for loss of data or other information, for business interruption, for personal injury, for loss of privacy arising out of or in any way related to the use of or inability to use the website, third-party software and/or third-party hardware used with the website, or otherwise in connection with any provision of this Agreement), even if MEMEFA.ST or any supplier has been advised of the possibility of such damages and even if the remedy fails of its essential purpose.
|
||||
|
||||
Some states/jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so the above limitation or exclusion may not apply to you.
|
||||
|
||||
@@ -147,7 +151,7 @@ ## Severability
|
||||
|
||||
If any provision of this Agreement is held to be unenforceable or invalid, such provision will be changed and interpreted to accomplish the objectives of such provision to the greatest extent possible under applicable law and the remaining provisions will continue in full force and effect.
|
||||
|
||||
This Agreement, together with the Privacy Policy and any other legal notices published by MEMEFAST on the Services, shall constitute the entire agreement between you and MEMEFAST concerning the Services. If any provision of this Agreement is deemed invalid by a court of competent jurisdiction, the invalidity of such provision shall not affect the validity of the remaining provisions of this Agreement, which shall remain in full force and effect. No waiver of any term of this Agreement shall be deemed a further or continuing waiver of such term or any other term, and MEMEFAST."’s" failure to assert any right or provision under this Agreement shall not constitute a waiver of such right or provision. YOU AND MEMEFAST AGREE THAT ANY CAUSE OF ACTION ARISING OUT OF OR RELATED TO THE SERVICES MUST COMMENCE WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES. OTHERWISE, SUCH CAUSE OF ACTION IS PERMANENTLY BARRED.
|
||||
This Agreement, together with the Privacy Policy and any other legal notices published by MEMEFA.ST on the Services, shall constitute the entire agreement between you and MEMEFA.ST concerning the Services. If any provision of this Agreement is deemed invalid by a court of competent jurisdiction, the invalidity of such provision shall not affect the validity of the remaining provisions of this Agreement, which shall remain in full force and effect. No waiver of any term of this Agreement shall be deemed a further or continuing waiver of such term or any other term, and MEMEFA.ST."’s" failure to assert any right or provision under this Agreement shall not constitute a waiver of such right or provision. YOU AND MEMEFA.ST AGREE THAT ANY CAUSE OF ACTION ARISING OUT OF OR RELATED TO THE SERVICES MUST COMMENCE WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES. OTHERWISE, SUCH CAUSE OF ACTION IS PERMANENTLY BARRED.
|
||||
|
||||
## Waiver
|
||||
|
||||
@@ -157,13 +161,13 @@ ## Waiver
|
||||
|
||||
## Amendments to this Agreement
|
||||
|
||||
MEMEFAST reserves the right, at its sole discretion, to modify or replace this Agreement at any time. If a revision is material we will provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at our sole discretion.
|
||||
By continuing to access or use our website after any revisions become effective, you agree to be bound by the revised terms. If you do not agree to the new terms, you are no longer authorized to use MEMEFAST.
|
||||
MEMEFA.ST reserves the right, at its sole discretion, to modify or replace this Agreement at any time. If a revision is material we will provide at least 30 days' notice prior to any new terms taking effect. What constitutes a material change will be determined at our sole discretion.
|
||||
By continuing to access or use our website after any revisions become effective, you agree to be bound by the revised terms. If you do not agree to the new terms, you are no longer authorized to use MEMEFA.ST.
|
||||
|
||||
## Entire Agreement
|
||||
|
||||
The Agreement constitutes the entire agreement between you and MEMEFAST regarding your use of the website and supersedes all prior and contemporaneous written or oral agreements between you and MEMEFAST.
|
||||
You may be subject to additional terms and conditions that apply when you use or purchase other MEMEFAST's services, which MEMEFAST will provide to you at the time of such use or purchase.
|
||||
The Agreement constitutes the entire agreement between you and MEMEFA.ST regarding your use of the website and supersedes all prior and contemporaneous written or oral agreements between you and MEMEFA.ST.
|
||||
You may be subject to additional terms and conditions that apply when you use or purchase other MEMEFA.ST's services, which MEMEFA.ST will provide to you at the time of such use or purchase.
|
||||
|
||||
## Updates to Our Terms
|
||||
|
||||
@@ -171,33 +175,33 @@ ## Updates to Our Terms
|
||||
|
||||
## Intellectual Property
|
||||
|
||||
The website and its entire contents, features and functionality (including but not limited to all information, software, text, displays, images, video and audio, and the design, selection and arrangement thereof), are owned by MEMEFAST, its licensors or other providers of such material and are protected by international copyright, trademark, patent, trade secret and other intellectual property or proprietary rights laws. The material may not be copied, modified, reproduced, downloaded or distributed in any way, in whole or in part, without the express prior written permission of MEMEFAST, unless and except as is expressly provided in these Terms & Conditions. Any unauthorized use of the material is prohibited.
|
||||
The website and its entire contents, features and functionality (including but not limited to all information, software, text, displays, images, video and audio, and the design, selection and arrangement thereof), are owned by MEMEFA.ST, its licensors or other providers of such material and are protected by international copyright, trademark, patent, trade secret and other intellectual property or proprietary rights laws. The material may not be copied, modified, reproduced, downloaded or distributed in any way, in whole or in part, without the express prior written permission of MEMEFA.ST, unless and except as is expressly provided in these Terms & Conditions. Any unauthorized use of the material is prohibited.
|
||||
|
||||
**Memes and Fair Use**: Memes created through our platform are generally considered fair use under copyright law and do not belong to MEMEFAST. Users retain rights to their created memes. However, all other content, including but not limited to the platform software, design, templates, and non-meme materials, remains the intellectual property of MEMEFAST.
|
||||
**Memes and Fair Use**: Memes created through our platform are generally considered fair use under copyright law and do not belong to MEMEFA.ST. Users retain rights to their created memes. However, all other content, including but not limited to the platform software, design, templates, and non-meme materials, remains the intellectual property of MEMEFA.ST.
|
||||
|
||||
## Use of AI Technologies
|
||||
|
||||
MEMEFAST uses AI technologies to generate images and videos. The underlying AI technology may, in some cases, provide incorrect, inaccurate, or otherwise inappropriate information. By using MEMEFAST, you agree that MEMEFAST is not responsible for any errors or inaccuracies in the AI-generated content. In many cases where AI is used, the underlying AI technology may generate content that may cause trademark or other intellectual property infringement. MEMEFAST does not endorse or guarantee that the content generated by AI is free from trademark and/or other intellectual property infringement. You are responsible for ensuring that the content generated by AI is accurate, relevant, and suitable for your intended use. If there is a situation where the AI technology has generated content that infringes on your intellectual property rights, you are responsible for ensuring the content is removed or replaced with content that does not infringe on intellectual property rights. MEMEFAST services contain options to regenerate the AI content. Please use these features to ensure the AI content is accurate and does not infringe on intellectual property rights.
|
||||
MEMEFA.ST uses AI technologies to generate images and videos. The underlying AI technology may, in some cases, provide incorrect, inaccurate, or otherwise inappropriate information. By using MEMEFA.ST, you agree that MEMEFA.ST is not responsible for any errors or inaccuracies in the AI-generated content. In many cases where AI is used, the underlying AI technology may generate content that may cause trademark or other intellectual property infringement. MEMEFA.ST does not endorse or guarantee that the content generated by AI is free from trademark and/or other intellectual property infringement. You are responsible for ensuring that the content generated by AI is accurate, relevant, and suitable for your intended use. If there is a situation where the AI technology has generated content that infringes on your intellectual property rights, you are responsible for ensuring the content is removed or replaced with content that does not infringe on intellectual property rights. MEMEFA.ST services contain options to regenerate the AI content. Please use these features to ensure the AI content is accurate and does not infringe on intellectual property rights.
|
||||
|
||||
## Agreement to Arbitrate
|
||||
|
||||
This section applies to any dispute EXCEPT IT DOESN’T INCLUDE A DISPUTE RELATING TO CLAIMS FOR INJUNCTIVE OR EQUITABLE RELIEF REGARDING THE ENFORCEMENT OR VALIDITY OF YOUR OR MEMEFAST."’s" INTELLECTUAL PROPERTY RIGHTS. The term “dispute” means any dispute, action, or other controversy between you and MEMEFAST concerning the Services or this agreement, whether in contract, warranty, tort, statute, regulation, ordinance, or any other legal or equitable basis. “Dispute” will be given the broadest possible meaning allowable under law.
|
||||
This section applies to any dispute EXCEPT IT DOESN’T INCLUDE A DISPUTE RELATING TO CLAIMS FOR INJUNCTIVE OR EQUITABLE RELIEF REGARDING THE ENFORCEMENT OR VALIDITY OF YOUR OR MEMEFA.ST."’s" INTELLECTUAL PROPERTY RIGHTS. The term “dispute” means any dispute, action, or other controversy between you and MEMEFA.ST concerning the Services or this agreement, whether in contract, warranty, tort, statute, regulation, ordinance, or any other legal or equitable basis. “Dispute” will be given the broadest possible meaning allowable under law.
|
||||
|
||||
## Notice of Dispute
|
||||
|
||||
In the event of a dispute, you or MEMEFAST must give the other a Notice of Dispute, which is a written statement that sets forth the name, address, and contact information of the party giving it, the facts giving rise to the dispute, and the relief requested. You must send any Notice of Dispute via email to: memefa.st@gmail.com. MEMEFAST will send any Notice of Dispute to you by mail to your address if we have it, or otherwise to your email address. You and MEMEFAST will attempt to resolve any dispute through informal negotiation within sixty (60) days from the date the Notice of Dispute is sent. After sixty (60) days, you or MEMEFAST may commence arbitration.
|
||||
In the event of a dispute, you or MEMEFA.ST must give the other a Notice of Dispute, which is a written statement that sets forth the name, address, and contact information of the party giving it, the facts giving rise to the dispute, and the relief requested. You must send any Notice of Dispute via email to: contact@memefa.st. MEMEFA.ST will send any Notice of Dispute to you by mail to your address if we have it, or otherwise to your email address. You and MEMEFA.ST will attempt to resolve any dispute through informal negotiation within sixty (60) days from the date the Notice of Dispute is sent. After sixty (60) days, you or MEMEFA.ST may commence arbitration.
|
||||
|
||||
## Binding Arbitration
|
||||
|
||||
If you and MEMEFAST don’t resolve any dispute by informal negotiation, any other effort to resolve the dispute will be conducted exclusively by binding arbitration as described in this section. You are giving up the right to litigate (or participate in as a party or class member) all disputes in court before a judge or jury. The dispute shall be settled by binding arbitration in accordance with the commercial arbitration rules of the American Arbitration Association. Either party may seek any interim or preliminary injunctive relief from any court of competent jurisdiction, as necessary to protect the party’s rights or property pending the completion of arbitration. Any and all legal, accounting, and other costs, fees, and expenses incurred by the prevailing party shall be borne by the non-prevailing party.
|
||||
If you and MEMEFA.ST don’t resolve any dispute by informal negotiation, any other effort to resolve the dispute will be conducted exclusively by binding arbitration as described in this section. You are giving up the right to litigate (or participate in as a party or class member) all disputes in court before a judge or jury. The dispute shall be settled by binding arbitration in accordance with the commercial arbitration rules of the American Arbitration Association. Either party may seek any interim or preliminary injunctive relief from any court of competent jurisdiction, as necessary to protect the party’s rights or property pending the completion of arbitration. Any and all legal, accounting, and other costs, fees, and expenses incurred by the prevailing party shall be borne by the non-prevailing party.
|
||||
|
||||
## Submissions and Privacy
|
||||
|
||||
In the event that you submit or post any ideas, creative suggestions, designs, photographs, information, advertisements, data or proposals, including ideas for new or improved products, services, features, technologies or promotions, you expressly agree that such submissions will automatically be treated as non-confidential and non-proprietary and will become the sole property of MEMEFAST without any compensation or credit to you whatsoever. MEMEFAST and its affiliates shall have no obligations with respect to such submissions or posts and may use the ideas contained in such submissions or posts for any purposes in any medium in perpetuity, including, but not limited to, developing, manufacturing, and marketing products and services using such ideas.
|
||||
In the event that you submit or post any ideas, creative suggestions, designs, photographs, information, advertisements, data or proposals, including ideas for new or improved products, services, features, technologies or promotions, you expressly agree that such submissions will automatically be treated as non-confidential and non-proprietary and will become the sole property of MEMEFA.ST without any compensation or credit to you whatsoever. MEMEFA.ST and its affiliates shall have no obligations with respect to such submissions or posts and may use the ideas contained in such submissions or posts for any purposes in any medium in perpetuity, including, but not limited to, developing, manufacturing, and marketing products and services using such ideas.
|
||||
|
||||
## Promotions
|
||||
|
||||
MEMEFAST may, from time to time, include contests, promotions, sweepstakes, or other activities (“Promotions”) that require you to submit material or information concerning yourself. Please note that all Promotions may be governed by separate rules that may contain certain eligibility requirements, such as restrictions as to age and geographic location. You are responsible to read all Promotions rules to determine whether or not you are eligible to participate. If you enter any Promotion, you agree to abide by and to comply with all Promotions Rules.
|
||||
MEMEFA.ST may, from time to time, include contests, promotions, sweepstakes, or other activities (“Promotions”) that require you to submit material or information concerning yourself. Please note that all Promotions may be governed by separate rules that may contain certain eligibility requirements, such as restrictions as to age and geographic location. You are responsible to read all Promotions rules to determine whether or not you are eligible to participate. If you enter any Promotion, you agree to abide by and to comply with all Promotions Rules.
|
||||
|
||||
Additional terms and conditions may apply to purchases of goods or services on or through the Services, which terms and conditions are made a part of this Agreement by this reference.
|
||||
|
||||
@@ -207,20 +211,20 @@ ## Typographical Errors
|
||||
|
||||
## Miscellaneous
|
||||
|
||||
If for any reason a court of competent jurisdiction finds any provision or portion of these Terms & Conditions to be unenforceable, the remainder of these Terms & Conditions will continue in full force and effect. Any waiver of any provision of these Terms & Conditions will be effective only if in writing and signed by an authorized representative of MEMEFAST. MEMEFAST will be entitled to injunctive or other equitable relief (without the obligations of posting any bond or surety) in the event of any breach or anticipatory breach by you. MEMEFAST operates and controls the MEMEFAST Service from its offices in . The Service is not intended for distribution to or use by any person or entity in any jurisdiction or country where such distribution or use would be contrary to law or regulation. Accordingly, those persons who choose to access the MEMEFAST Service from other locations do so on their own initiative and are solely responsible for compliance with local laws, if and to the extent local laws are applicable. These Terms & Conditions (which include and incorporate the MEMEFAST Privacy Policy) contains the entire understanding, and supersedes all prior understandings, between you and MEMEFAST concerning its subject matter, and cannot be changed or modified by you. The section headings used in this Agreement are for convenience only and will not be given any legal import.
|
||||
If for any reason a court of competent jurisdiction finds any provision or portion of these Terms & Conditions to be unenforceable, the remainder of these Terms & Conditions will continue in full force and effect. Any waiver of any provision of these Terms & Conditions will be effective only if in writing and signed by an authorized representative of MEMEFA.ST. MEMEFA.ST will be entitled to injunctive or other equitable relief (without the obligations of posting any bond or surety) in the event of any breach or anticipatory breach by you. MEMEFA.ST operates and controls the MEMEFA.ST Service from its offices in . The Service is not intended for distribution to or use by any person or entity in any jurisdiction or country where such distribution or use would be contrary to law or regulation. Accordingly, those persons who choose to access the MEMEFA.ST Service from other locations do so on their own initiative and are solely responsible for compliance with local laws, if and to the extent local laws are applicable. These Terms & Conditions (which include and incorporate the MEMEFA.ST Privacy Policy) contains the entire understanding, and supersedes all prior understandings, between you and MEMEFA.ST concerning its subject matter, and cannot be changed or modified by you. The section headings used in this Agreement are for convenience only and will not be given any legal import.
|
||||
|
||||
## Disclaimer
|
||||
|
||||
MEMEFAST is not responsible for any content, code or any other imprecision.
|
||||
MEMEFA.ST is not responsible for any content, code or any other imprecision.
|
||||
|
||||
MEMEFAST does not provide warranties or guarantees.
|
||||
MEMEFA.ST does not provide warranties or guarantees.
|
||||
|
||||
In no event shall MEMEFAST be liable for any special, direct, indirect, consequential, or incidental damages or any damages whatsoever, whether in an action of contract, negligence or other tort, arising out of or in connection with the use of the Service or the contents of the Service. MEMEFAST reserves the right to make additions, deletions, or modifications to the contents on the Service at any time without prior notice.
|
||||
In no event shall MEMEFA.ST be liable for any special, direct, indirect, consequential, or incidental damages or any damages whatsoever, whether in an action of contract, negligence or other tort, arising out of or in connection with the use of the Service or the contents of the Service. MEMEFA.ST reserves the right to make additions, deletions, or modifications to the contents on the Service at any time without prior notice.
|
||||
|
||||
The MEMEFAST Service and its contents are provided "as is" and "as available" without any warranty or representations of any kind, whether express or implied. MEMEFAST is a distributor and not a publisher of the content supplied by third parties; as such, MEMEFAST exercises no editorial control over such content and makes no warranty or representation as to the accuracy, reliability or currency of any information, content, service or merchandise provided through or accessible via the MEMEFAST Service. Without limiting the foregoing, MEMEFAST specifically disclaims all warranties and representations in any content transmitted on or in connection with the MEMEFAST Service or on sites that may appear as links on the MEMEFAST Service, or in the products provided as a part of, or otherwise in connection with, the MEMEFAST Service, including without limitation any warranties of merchantability, fitness for a particular purpose or non-infringement of third party rights. No oral advice or written information given by MEMEFAST or any of its affiliates, employees, officers, directors, agents, or the like will create a warranty. Price and availability information is subject to change without notice. Without limiting the foregoing, MEMEFAST does not warrant that the MEMEFAST Service will be uninterrupted, uncorrupted, timely, or error-free.
|
||||
The MEMEFA.ST Service and its contents are provided "as is" and "as available" without any warranty or representations of any kind, whether express or implied. MEMEFA.ST is a distributor and not a publisher of the content supplied by third parties; as such, MEMEFA.ST exercises no editorial control over such content and makes no warranty or representation as to the accuracy, reliability or currency of any information, content, service or merchandise provided through or accessible via the MEMEFA.ST Service. Without limiting the foregoing, MEMEFA.ST specifically disclaims all warranties and representations in any content transmitted on or in connection with the MEMEFA.ST Service or on sites that may appear as links on the MEMEFA.ST Service, or in the products provided as a part of, or otherwise in connection with, the MEMEFA.ST Service, including without limitation any warranties of merchantability, fitness for a particular purpose or non-infringement of third party rights. No oral advice or written information given by MEMEFA.ST or any of its affiliates, employees, officers, directors, agents, or the like will create a warranty. Price and availability information is subject to change without notice. Without limiting the foregoing, MEMEFA.ST does not warrant that the MEMEFA.ST Service will be uninterrupted, uncorrupted, timely, or error-free.
|
||||
|
||||
## Contact Us
|
||||
|
||||
Don't hesitate to contact us if you have any questions.
|
||||
|
||||
- Via Email: memefa.st@gmail.com
|
||||
- Via Email: contact@memefa.st
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
use App\Http\Controllers\AdminDashboardController;
|
||||
use App\Http\Controllers\AdminDuplicateController;
|
||||
use App\Http\Controllers\FrontHomeController;
|
||||
use App\Http\Controllers\FrontMemeController;
|
||||
use App\Http\Controllers\FrontPagesController;
|
||||
use App\Http\Controllers\SocialAuthController;
|
||||
use App\Http\Controllers\UserDashboardController;
|
||||
@@ -74,6 +75,25 @@
|
||||
Route::get('/terms', [FrontPagesController::class, 'terms'])
|
||||
->middleware('cacheResponse')
|
||||
->name('terms');
|
||||
Route::get('/dmca-copyright', [FrontPagesController::class, 'dmcaCopyright'])
|
||||
->middleware('cacheResponse')
|
||||
->name('dmca-copyright');
|
||||
|
||||
Route::get('/meme-library', [FrontMemeController::class, 'index'])
|
||||
->middleware('cacheResponse')
|
||||
->name('memes.index');
|
||||
|
||||
Route::get('/meme-library/{search}', [FrontMemeController::class, 'search'])
|
||||
->middleware('cacheResponse')
|
||||
->name('memes.search');
|
||||
|
||||
Route::get('/meme/{slug}', [FrontMemeController::class, 'show'])
|
||||
->middleware('cacheResponse')
|
||||
->name('memes.show');
|
||||
|
||||
Route::get('/meme/og/{ids}.jpg', [FrontMemeController::class, 'generateOG'])
|
||||
->middleware('cacheResponse')
|
||||
->name('memes.og');
|
||||
|
||||
// Admin Tools with Basic Auth
|
||||
Route::prefix('duplicates')->middleware([BasicAuthMiddleware::class])->group(function () {
|
||||
|
||||
Reference in New Issue
Block a user