From ad4bdec18829a85c4095600964d666b8314e4c33 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 8 Feb 2026 03:52:45 +0000 Subject: [PATCH] Viblo 2.0 --- ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 19874 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 3126 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 699 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 3923 bytes core/migrations/0001_initial.py | 48 +++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2975 bytes core/models.py | 43 +++- core/templates/base.html | 178 ++++++++++++++-- core/templates/core/index.html | 196 +++++------------- core/templates/core/project_detail.html | 167 +++++++++++++++ core/urls.py | 10 +- core/views.py | 85 ++++++-- 13 files changed, 540 insertions(+), 187 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/templates/core/project_detail.html diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9beeae7341d797e2eac5af07416a24e9ee781f92 GIT binary patch literal 404 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 Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..40d69681591d5509022b37a3b53aeee8f169ff76 100644 GIT binary patch literal 699 zcmZ{h&x_MQ6vy8*lWwxHThx=XN3j%i<3SXbWkFc6AP82x)I*7xM>jRUm`v>2gY?*g z_uZo>Mf4#4B~!?u`8JjGutZycd_rC8llf0L&t=1+e``DZZDFOJcliI8* zIQyl7V_?8Y2oV_&0<6J|un`#pgFpk2Fp9>Q)(4sSqxr=E_^zI{{be>3W7Z0@u4HV* zG%uLVD;Y;I8yC#Af0+>-SgiF5x?86j>XMSCo;W;J?dimPAK)Y_p)`Y-;gK%KUWC(j z%9Anr!u2_N0^M?J9SkdddaDNZf>`WU$uMC13avAS!VAJ__rK@}W8~`k`L<9dc%kA&;laosq#wbMV2JIa-g0#%Cwd7OQNGbO?KJ@+t) z(9PfGvB+IKLO&M?cP9ydm!+PMuAgvKR&UrzKb%{8QNr>N_xW{oSWhZDR&HewLYA;C zFYhJXl$ZCa38pikH)f7rysf_N4^p$dXaE2J delta 251 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 - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {{ title|default:"AI Video Creator" }} + + + + + + + + + + + + + {% block extra_head %}{% endblock %} - - {% block content %}{% endblock %} - - + + +
+ {% block content %}{% endblock %} +
+ +
+
+

© 2026 AI Video Creator Studio. Built for Unlimited Creation.

+
+
+ + + + {% block extra_js %}{% endblock %} + + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..b7b4725 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,57 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+
+

Create Magic with AI.

+

Transform your ideas into viral short-form videos in seconds. No editing skills required.

+
+
+
+

New Project

+
+ {% csrf_token %} +
+ + +
+
+ + +
+ +
+
+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + +
+
+

Recent Projects

+
+ + {% for project in projects %} +
+
+
+ {{ project.get_status_display }} + {{ project.created_at|date:"M d, Y" }} +
+

{{ project.title }}

+

{{ project.description|truncatewords:20 }}

+ +
+
+ {% empty %} +
+
+

No projects yet. Start by creating your first one above!

+
+
+ {% endfor %} +
+ +{% endblock %} diff --git a/core/templates/core/project_detail.html b/core/templates/core/project_detail.html new file mode 100644 index 0000000..c72cfbf --- /dev/null +++ b/core/templates/core/project_detail.html @@ -0,0 +1,167 @@ +{% extends 'base.html' %} + +{% block content %} +
+ + +
+
+
+
+

AI Script Generator

+ {{ project.get_status_display }} +
+ +
+ {% csrf_token %} +
+ + +
+
AI will brainstorm scenes, actions, and dialogue for your short video.
+
+ +
+
+
+

Generated Script

+ +
+
+
+
+
+ +
+

Media Assets

+
+
+
+
Upload Clips
+ +
+
+ {% for asset in assets %} +
+
+
+ {{ asset.original_name }} +
+
+
+ {% empty %} +
+

Your uploaded video clips and images will appear here.

+
+ {% endfor %} +
+
+
+ +
+
+

Project Details

+
+ +
{{ project.title }}
+
+
+ +
{{ project.created_at|date:"M d, Y H:i" }}
+
+
+ +
{{ project.description|default:"No description provided." }}
+
+
+ +
+ +
+

Script History

+
+ {% for script in scripts %} +
+
{{ script.created_at|date:"M d, H:i" }}
+
{{ script.prompt|truncatechars:40 }}
+ +
+ {% empty %} +

No scripts generated yet.

+ {% endfor %} +
+
+
+
+
+{% endblock %} + +{% block extra_js %} + +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..1974411 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,9 @@ from django.urls import path - -from .views import home +from . import views urlpatterns = [ - path("", home, name="home"), -] + path('', views.index, name='index'), + path('project/create/', views.create_project, name='create_project'), + path('project//', views.project_detail, name='project_detail'), + path('project//generate-script/', views.generate_script, name='generate_script'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..281a283 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,68 @@ -import os -import platform +import json +from django.shortcuts import render, redirect, get_object_or_404 +from django.http import JsonResponse +from django.views.decorators.http import require_POST +from .models import Project, Script, MediaAsset +from ai.local_ai_api import LocalAIApi -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def index(request): + projects = Project.objects.all().order_by('-created_at') + return render(request, 'core/index.html', { + 'projects': projects, + 'title': 'Creator Studio Dashboard', + }) +@require_POST +def create_project(request): + title = request.POST.get('title', 'Untitled Project') + description = request.POST.get('description', '') + project = Project.objects.create(title=title, description=description) + return redirect('project_detail', project_id=project.id) -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() +def project_detail(request, project_id): + project = get_object_or_404(Project, id=project_id) + scripts = project.scripts.all().order_by('-created_at') + assets = project.assets.all().order_by('-created_at') + return render(request, 'core/project_detail.html', { + 'project': project, + 'scripts': scripts, + 'assets': assets, + 'title': f'Studio: {project.title}', + }) - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } - return render(request, "core/index.html", context) +@require_POST +def generate_script(request, project_id): + project = get_object_or_404(Project, id=project_id) + prompt = request.POST.get('prompt', '') + + if not prompt: + return JsonResponse({'success': False, 'error': 'Prompt is required'}) + + # Construct a high-quality AI prompt for video scripting + ai_input = [ + {"role": "system", "content": "You are an expert social media content creator and scriptwriter for TikTok, Reels, and YouTube Shorts. Generate a catchy script with Scene details, Action, and Dialogue/Narration."}, + {"role": "user", "content": f"Generate a short-form video script for the following idea: {prompt}"} + ] + + response = LocalAIApi.create_response({ + "input": ai_input, + }) + + if response.get("success"): + content = LocalAIApi.extract_text(response) + script = Script.objects.create( + project=project, + prompt=prompt, + content=content + ) + return JsonResponse({ + 'success': True, + 'content': content, + 'script_id': script.id, + 'created_at': script.created_at.strftime('%Y-%m-%d %H:%M') + }) + else: + return JsonResponse({ + 'success': False, + 'error': response.get('message', 'AI Generation failed') + }) \ No newline at end of file