From fad39447228e0a8204056fe1d46ea971657a06e8 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 18 Nov 2025 03:33:52 +0000 Subject: [PATCH] Final 100 --- ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 13948 bytes core/__pycache__/views.cpython-311.pyc | Bin 1933 -> 3344 bytes core/templates/base.html | 5 +- core/templates/core/index.html | 262 +++++++++++++++++--- core/views.py | 61 ++++- static/css/custom.css | 216 ++++++++++++---- 7 files changed, 452 insertions(+), 92 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bcb2fbacced8a64c23d6a403697ca4fcbf18d9a GIT binary patch literal 404 zcma)(ze__g5XbX=w3XW8>=xX*yf^72LP5n+adGl3Atu*0^}Qq}d9?K(adQ>_0RNAU z@+QH_P3YFi1k~B%_}m@b_wL}H`~5ER_H?u>UVZ!s#jnLb$>zW(kBFlJ@rcJ|RK-PH zB}G!DMOw9rR)lzRjRxt%*#(pujKvdWu#gT6WlqQ`UI;hCZU*?gq^?v`!SHZ|wNc9z zo)}f((>aw>g_+`zeMWxYAZ@yriqUd78fww(F$2^AF<`Zl7MhNM`x>lk_BjL7X?UczE z%G_B^8RS&tga|1dA(>uncaAH?>k>{(&&$K<_R!-iiK6HYjn`=Wj&9cfa}%EN4X0ar Ad;kCd literal 0 HcmV?d00001 diff --git a/ai/__pycache__/local_ai_api.cpython-311.pyc b/ai/__pycache__/local_ai_api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93112e367c6762d2d5c5cbbc28c437b5ddadc7d7 GIT binary patch literal 13948 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 1e42323410f928688311468fe397bb5a1206846e..89b7e7b5afd46e7bfb596702bd46f291eadc5dfc 100644 GIT binary patch literal 3344 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 - + {% load static %} {% block head %}{% endblock %} +
diff --git a/core/templates/core/index.html b/core/templates/core/index.html index 7d7a4ad..9ea9049 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,23 +1,143 @@ {% extends "base.html" %} {% load static %} -{% block title %}Viral YouTube Content Generator{% endblock %} +{% block title %}AI-Powered Content Generator{% endblock %} {% block head %} - - - + + + +{% endblock %} + +{% block structured_data %} +{ + "@context": "https://schema.org", + "@type": "FAQPage", + "mainEntity": [{ + "@type": "Question", + "name": "What is an SEO Content Generator?", + "acceptedAnswer": { + "@type": "Answer", + "text": "An SEO Content Generator is a tool that uses artificial intelligence to help you create search-engine-optimized content for your website or social media channels. By inputting a topic, you can generate relevant keywords, compelling titles, and other content to improve your search rankings and attract more traffic." + } + },{ + "@type": "Question", + "name": "How do I use the AI generator?", + "acceptedAnswer": { + "@type": "Answer", + "text": "Using the generator is simple. Just choose your desired content type (Website SEO or YouTube SEO), enter a topic or keyword into the input field, and click the 'Generate' button. The tool will then provide you with a list of suggestions that you can copy and use in your content." + } + },{ + "@type": "Question", + "name": "Can I use the generated keywords for free?", + "acceptedAnswer": { + "@type": "Answer", + "text": "Yes, all keywords, titles, and hashtags generated by our tool are completely free to use. There are no hidden fees or subscription costs." + } + }] +} {% endblock %} {% block content %}
-

Free YouTube Tag Generator & SEO Tool

-
-

Instantly generate thousands of relevant YouTube tags for your videos. Our free tool helps you boost your video's SEO and get more views.

-
- A person using a laptop with code on the screen, representing the YouTube tag generation process. -
+

AI-Powered Content Generator

+
+

Choose your content type and enter a topic to generate titles, keywords, and more.

+ + + +
+
+
+ {% csrf_token %} + +
+ + +
+
+ + {% if results %} +
+

Your Results for "{{ topic }}"

+
+
+
+

Suggested Title

+
+

{{ results.title }}

+ +
+
+
+
+
+

SEO Keywords

+
+

{{ results.keywords|join:", " }}

+ +
+
+
+
+
+ {% endif %} +
+ +
+
+ {% csrf_token %} + +
+ + +
+
+ + {% if youtube_results %} +
+

Your YouTube Results for "{{ topic }}"

+
+
+
+

Suggested Title

+
+

{{ youtube_results.title }}

+ +
+
+
+
+
+

Keywords

+
+

{{ youtube_results.keywords|join:", " }}

+ +
+
+
+
+
+

Hashtags

+
+

{{ youtube_results.hashtags|join:" " }}

+ +
+
+
+
+
+ {% endif %} +
+
{% if error %} @@ -26,33 +146,113 @@
-{% if results %} -
-

Your Results for "{{ topic }}"

+ +
-
-
-

Suggested Viral Title (H1)

-

{{ results.title }}

+
+

What Our Users Say

+
+
+
+
+
+

"This tool is a game-changer! I was able to generate a month's worth of content ideas in just a few minutes. Highly recommended!"

+

- Sarah J.

-
-
-

Suggested Hashtags

-
- {% for tag in results.hashtags %} - {{ tag }} - {% endfor %} -
+
+
+

"I love how easy it is to use. The interface is clean and intuitive, and the results are always top-notch."

+

- Mark T.

-
-
-

Suggested Tags

-

{{ results.tags|join:", " }}

+
+
+

"The best SEO tool I've ever used. It's saved me hours of research and helped me rank my videos higher than ever before."

+

- Emily R.

-{% endif %} -{% endblock %} + + +
+
+
+

Frequently Asked Questions

+
+
+
+
+
+
+

+ +

+
+
+ An SEO Content Generator is a tool that uses artificial intelligence to help you create search-engine-optimized content for your website or social media channels. By inputting a topic, you can generate relevant keywords, compelling titles, and other content to improve your search rankings and attract more traffic. +
+
+
+
+

+ +

+
+
+ Using the generator is simple. Just choose your desired content type (Website SEO or YouTube SEO), enter a topic or keyword into the input field, and click the 'Generate' button. The tool will then provide you with a list of suggestions that you can copy and use in your content. +
+
+
+
+

+ +

+
+
+ Yes, all keywords, titles, and hashtags generated by our tool are completely free to use. There are no hidden fees or subscription costs. +
+
+
+
+
+
+
+ + +
+
+
+
+

About the Developer

+

This website was created by a passionate developer dedicated to building helpful and easy-to-use tools for content creators. With a background in web development and a passion for SEO, the goal is to empower creators with the resources they need to succeed.

+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/core/views.py b/core/views.py index af8c5da..fb4b5b0 100644 --- a/core/views.py +++ b/core/views.py @@ -1,4 +1,8 @@ from django.shortcuts import render +from ai.local_ai_api import LocalAIApi +import logging + +logger = logging.getLogger(__name__) def home(request): """ @@ -7,18 +11,57 @@ def home(request): context = {} if request.method == 'POST': topic = request.POST.get('topic', '').strip() + form_type = request.POST.get('form_type', 'website') # Default to website + context['topic'] = topic + context['form_type'] = form_type if not topic: - context['error'] = 'Please enter a video topic.' + context['error'] = 'Please enter a topic.' else: - # Mock data for demonstration purposes - context['results'] = { - 'title': f'🚀 The Ultimate Guide to {topic.title()} in 2025 | SEO Secrets', - 'hashtags': ['#' + ''.join(word.capitalize() for word in topic.split()), '#YouTube', '#SEO', '#Viral', '#ContentCreation'], - 'tags': [topic, f'{topic} tutorial`, `learn {topic}', 'how to', '2025', 'SEO tips', 'viral video'] - } - context['meta_description'] = f'Get the best viral tags, hashtags, and titles for your video about {topic}. Boost your views with our AI-powered suggestions.' - context['slug'] = f'viral-guide-{topic.lower().replace(" ", "-")}' + try: + if form_type == 'website': + prompt = { + "input": [ + {"role": "system", "content": "You are an expert SEO content strategist. Generate a compelling blog post title and a list of relevant SEO keywords for a given topic. Return the result as a JSON object with two keys: 'title' and 'keywords'. The 'keywords' should be a list of strings."}, + {"role": "user", "content": f"The topic is: {topic}"}, + ], + "text": {"format": {"type": "json_object"}}, + } + response = LocalAIApi.create_response(prompt) + + if response.get("success"): + payload = LocalAIApi.decode_json_from_response(response) + if payload: + context['results'] = payload + else: + context['error'] = 'Failed to generate content. The AI response was not valid JSON.' + else: + logger.warning("AI error: %s", response.get("error")) + context['error'] = 'Failed to generate content due to an AI error.' + + elif form_type == 'youtube': + prompt = { + "input": [ + {"role": "system", "content": "You are a YouTube content expert. Generate a catchy title, a list of relevant keywords, and a list of hashtags for a given video topic. Return the result as a JSON object with three keys: 'title', 'keywords', and 'hashtags'. 'keywords' and 'hashtags' should be lists of strings."}, + {"role": "user", "content": f"The topic is: {topic}"}, + ], + "text": {"format": {"type": "json_object"}}, + } + response = LocalAIApi.create_response(prompt) + + if response.get("success"): + payload = LocalAIApi.decode_json_from_response(response) + if payload: + context['youtube_results'] = payload + else: + context['error'] = 'Failed to generate content. The AI response was not valid JSON.' + else: + logger.warning("AI error: %s", response.get("error")) + context['error'] = 'Failed to generate content due to an AI error.' + + except Exception as e: + logger.error("An unexpected error occurred: %s", e) + context['error'] = 'An unexpected error occurred.' return render(request, "core/index.html", context) diff --git a/static/css/custom.css b/static/css/custom.css index 2a01c49..9220be7 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,54 +1,53 @@ /* General Body Styles */ body { - background-color: #0F3460; /* Dark Blue */ - color: #FFFFFF; - font-family: 'Roboto', sans-serif; + background-color: #000000; /* Black */ + color: #FFFFFF; /* White */ + font-family: 'Playfair Display', serif; } -/* Hero Section */ -.hero { +/* Remove background image overlay */ +body::before { + display: none; +} + +/* Make sure content is on top of the overlay */ +.hero-section, .results-section { position: relative; - padding: 100px 0; - text-align: center; - background-image: url('../pasted-20251118-024426-e59dd4cc.jpg'); - background-size: cover; - background-position: center; - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; -} - -.hero::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(15, 52, 96, 0.6); /* Dark Blue overlay, slightly more transparent */ z-index: 1; } -.hero .container { - position: relative; - z-index: 2; + +/* Hero Section */ +.hero-section { + padding: 6rem 0; + text-align: center; + background-color: transparent; } +.hero-content { + background-color: rgba(255, 255, 255, 0.05); /* Subtle glass effect */ + padding: 2rem; + border-radius: 15px; + display: inline-block; +} + + /* Typography */ -h1, .h1 { - font-family: 'Poppins', sans-serif; +h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { + font-family: 'Playfair Display', serif; font-weight: 700; color: #FFFFFF; - font-size: 3.8rem; /* Slightly larger */ - margin-bottom: 1rem; - text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.7); /* Stylish shadow */ } -p.lead { - color: rgba(255, 255, 255, 0.9); /* Brighter lead text */ - margin-bottom: 2rem; - text-shadow: 1px 1px 4px rgba(0, 0, 0, 0.6); /* Subtle shadow */ +h1, .h1 { + font-size: 3.8rem; + margin-bottom: 1rem; + text-shadow: none; +} + +p, .lead { + color: rgba(255, 255, 255, 0.9); + text-shadow: none; } /* Form Styles */ @@ -65,42 +64,41 @@ p.lead { .form-control:focus { background-color: rgba(255, 255, 255, 0.2); - border-color: #E94560; /* Accent Pink/Red */ + border-color: #FFFFFF; color: #FFFFFF; - box-shadow: 0 0 0 0.25rem rgba(233, 69, 96, 0.25); + box-shadow: 0 0 0 0.25rem rgba(255, 255, 255, 0.25); } /* Button Styles */ .btn-primary { - background-color: #E94560; /* Accent Pink/Red */ - border-color: #E94560; + background-color: #FFFFFF; + border-color: #FFFFFF; + color: #000000; padding: 1rem 2rem; font-weight: 700; transition: background-color 0.3s ease, border-color 0.3s ease; } .btn-primary:hover { - background-color: #c73049; - border-color: #c73049; + background-color: #CCCCCC; + border-color: #CCCCCC; } /* Results Section */ .results-section { - background-color: #1A1A2E; /* Deep Navy */ - padding: 4rem; + background-color: rgba(255, 255, 255, 0.05); /* Subtle glass effect */ + padding: 2rem; border-radius: 15px; - margin-top: 3rem; + margin-top: 2rem; border: 1px solid rgba(255, 255, 255, 0.1); } .results-section h2 { - font-family: 'Poppins', sans-serif; - color: #E94560; /* Accent Pink/Red */ + color: #FFFFFF; margin-bottom: 1.5rem; } .results-section h3 { - font-family: 'Poppins', sans-serif; font-size: 1.5rem; color: #FFFFFF; margin-top: 1.5rem; @@ -110,9 +108,7 @@ p.lead { .generated-title { font-size: 1.75rem; font-weight: bold; - background: -webkit-linear-gradient(45deg, #E94560, #FFC700); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; + color: #FFFFFF; } .hashtag { @@ -125,3 +121,121 @@ p.lead { margin-bottom: 0.5rem; font-size: 0.9rem; } + + +/* Custom CSS for the new SEO generator */ +.result-item { + margin-bottom: 2rem; +} + +.result-item h3 { + color: #FFFFFF; +} + +.result-item .form-control { + background-color: #333333; + border-color: #555555; + color: #FFFFFF; + min-height: 50px; +} + +.result-item .btn-outline-secondary { + color: #FFFFFF; + border-color: #FFFFFF; +} + +.result-item .btn-outline-secondary:hover { + background-color: #FFFFFF; + color: #000000; +} + +/* Tab Styles */ +.nav-tabs { + border-bottom: 1px solid #FFFFFF; +} + +.nav-tabs .nav-link { + background-color: transparent; + border: none; + color: rgba(255, 255, 255, 0.7); +} + +.nav-tabs .nav-link.active { + color: #000000; + background-color: #FFFFFF; + border-color: #FFFFFF; +} + +.tab-content { + padding-top: 1rem; +} + +/* Section Title */ +.section-title { + font-family: 'Playfair Display', serif; + font-weight: 700; + color: #FFFFFF; + font-size: 2.5rem; + margin-bottom: 2rem; + text-shadow: none; +} + +/* Review Section */ +.review-card { + background-color: rgba(255, 255, 255, 0.05); + padding: 2rem; + border-radius: 15px; + border: 1px solid rgba(255, 255, 255, 0.1); + height: 100%; +} + +.review-text { + font-style: italic; + color: rgba(255, 255, 255, 0.9); +} + +.review-author { + font-weight: 700; + color: #FFFFFF; + text-align: right; +} + +/* FAQ Section */ +.accordion-item { + background-color: rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.1); + margin-bottom: 1rem; + border-radius: 15px !important; +} + +.accordion-button { + background-color: transparent; + color: #FFFFFF; + font-family: 'Playfair Display', serif; + font-weight: 700; + border: none; + box-shadow: none; +} + +.accordion-button:not(.collapsed) { + color: #FFFFFF; + background-color: transparent; +} + +.accordion-body { + color: rgba(255, 255, 255, 0.9); +} + +/* About Section */ +.about-card { + background-color: rgba(255, 255, 255, 0.05); + padding: 2rem; + border-radius: 15px; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.about-text { + color: rgba(255, 255, 255, 0.9); + font-size: 1.1rem; + line-height: 1.8; +}