From dd8c7aa0f2ac6c0d12649662cb75ff21bf804eda Mon Sep 17 00:00:00 2001 From: Derrick Mwiti Date: Tue, 29 Apr 2025 10:28:11 +0300 Subject: [PATCH 1/2] Qdrant-Powered AI Video Idea Generation --- .DS_Store | Bin 0 -> 8196 bytes video-generation/.DS_Store | Bin 0 -> 6148 bytes video-generation/README.MD | 271 ++++++++ video-generation/backend/.gitignore | 176 ++++++ video-generation/backend/Dockerfile | 26 + video-generation/backend/api/__init__.py | 0 video-generation/backend/api/admin.py | 0 video-generation/backend/api/apps.py | 6 + .../backend/api/management/__init__.py | 0 .../api/management/commands/__init__.py | 0 .../commands/create_qdrant_collection.py | 9 + .../commands/run_youtube_process.py | 15 + .../api/management/commands/schedule_tasks.py | 35 ++ .../backend/api/migrations/__init__.py | 0 video-generation/backend/api/models.py | 3 + video-generation/backend/api/qdrant_utils.py | 63 ++ video-generation/backend/api/redis_client.py | 5 + video-generation/backend/api/tasks.py | 587 ++++++++++++++++++ video-generation/backend/api/tests.py | 3 + video-generation/backend/api/transcription.py | 27 + video-generation/backend/api/urls.py | 9 + video-generation/backend/api/views.py | 71 +++ video-generation/backend/api/youtube_utils.py | 138 ++++ video-generation/backend/app/__init__.py | 3 + video-generation/backend/app/asgi.py | 16 + video-generation/backend/app/celery.py | 16 + video-generation/backend/app/middleware.py | 31 + video-generation/backend/app/settings.py | 193 ++++++ video-generation/backend/app/urls.py | 25 + video-generation/backend/app/wsgi.py | 16 + video-generation/backend/compose-example.yml | 26 + video-generation/backend/django.sh | 14 + video-generation/backend/docker-compose.yml | 80 +++ video-generation/backend/env_example | 14 + video-generation/backend/manage.py | 22 + video-generation/backend/requirements.txt | 24 + video-generation/backend/users/__init__.py | 0 video-generation/backend/users/admin.py | 10 + video-generation/backend/users/apps.py | 6 + .../backend/users/migrations/0001_initial.py | 67 ++ .../users/migrations/0002_user_flux_model.py | 18 + .../backend/users/migrations/__init__.py | 0 video-generation/backend/users/models.py | 90 +++ video-generation/backend/users/serializers.py | 86 +++ video-generation/backend/users/tests.py | 3 + video-generation/backend/users/urls.py | 21 + video-generation/backend/users/utils.py | 24 + video-generation/backend/users/views.py | 183 ++++++ video-generation/front-end/.gitignore | 25 + .../front-end/.vscode/extensions.json | 3 + video-generation/front-end/README.md | 5 + video-generation/front-end/env_example | 3 + video-generation/front-end/index.html | 13 + video-generation/front-end/public/vite.svg | 1 + video-generation/front-end/src/App.vue | 61 ++ .../front-end/src/assets/logo.png | Bin 0 -> 244074 bytes .../front-end/src/components/AuthLayout.vue | 28 + .../front-end/src/components/Sidebar.vue | 49 ++ video-generation/front-end/src/main.ts | 10 + video-generation/front-end/src/pages/Home.vue | 28 + .../front-end/src/pages/SignIn.vue | 40 ++ .../front-end/src/pages/SignUp.vue | 40 ++ .../front-end/src/router/index.ts | 66 ++ video-generation/front-end/src/store/auth.ts | 57 ++ video-generation/front-end/src/style.css | 90 +++ .../front-end/src/utils/googleAuth.ts | 22 + .../front-end/src/views/Create.vue | 82 +++ .../front-end/src/views/MyVideos.vue | 149 +++++ .../front-end/src/views/OAuth2Callback.vue | 57 ++ .../front-end/src/views/Settings.vue | 267 ++++++++ video-generation/front-end/src/vite-env.d.ts | 1 + video-generation/front-end/src/vue-shims.d.ts | 5 + video-generation/front-end/vite.config.ts | 10 + 73 files changed, 3544 insertions(+) create mode 100644 .DS_Store create mode 100644 video-generation/.DS_Store create mode 100644 video-generation/README.MD create mode 100644 video-generation/backend/.gitignore create mode 100644 video-generation/backend/Dockerfile create mode 100644 video-generation/backend/api/__init__.py create mode 100644 video-generation/backend/api/admin.py create mode 100644 video-generation/backend/api/apps.py create mode 100644 video-generation/backend/api/management/__init__.py create mode 100644 video-generation/backend/api/management/commands/__init__.py create mode 100644 video-generation/backend/api/management/commands/create_qdrant_collection.py create mode 100644 video-generation/backend/api/management/commands/run_youtube_process.py create mode 100644 video-generation/backend/api/management/commands/schedule_tasks.py create mode 100644 video-generation/backend/api/migrations/__init__.py create mode 100644 video-generation/backend/api/models.py create mode 100644 video-generation/backend/api/qdrant_utils.py create mode 100644 video-generation/backend/api/redis_client.py create mode 100644 video-generation/backend/api/tasks.py create mode 100644 video-generation/backend/api/tests.py create mode 100644 video-generation/backend/api/transcription.py create mode 100644 video-generation/backend/api/urls.py create mode 100644 video-generation/backend/api/views.py create mode 100644 video-generation/backend/api/youtube_utils.py create mode 100644 video-generation/backend/app/__init__.py create mode 100644 video-generation/backend/app/asgi.py create mode 100644 video-generation/backend/app/celery.py create mode 100644 video-generation/backend/app/middleware.py create mode 100644 video-generation/backend/app/settings.py create mode 100644 video-generation/backend/app/urls.py create mode 100644 video-generation/backend/app/wsgi.py create mode 100644 video-generation/backend/compose-example.yml create mode 100644 video-generation/backend/django.sh create mode 100644 video-generation/backend/docker-compose.yml create mode 100644 video-generation/backend/env_example create mode 100755 video-generation/backend/manage.py create mode 100644 video-generation/backend/requirements.txt create mode 100644 video-generation/backend/users/__init__.py create mode 100644 video-generation/backend/users/admin.py create mode 100644 video-generation/backend/users/apps.py create mode 100644 video-generation/backend/users/migrations/0001_initial.py create mode 100644 video-generation/backend/users/migrations/0002_user_flux_model.py create mode 100644 video-generation/backend/users/migrations/__init__.py create mode 100644 video-generation/backend/users/models.py create mode 100644 video-generation/backend/users/serializers.py create mode 100644 video-generation/backend/users/tests.py create mode 100644 video-generation/backend/users/urls.py create mode 100644 video-generation/backend/users/utils.py create mode 100644 video-generation/backend/users/views.py create mode 100644 video-generation/front-end/.gitignore create mode 100644 video-generation/front-end/.vscode/extensions.json create mode 100644 video-generation/front-end/README.md create mode 100644 video-generation/front-end/env_example create mode 100644 video-generation/front-end/index.html create mode 100644 video-generation/front-end/public/vite.svg create mode 100644 video-generation/front-end/src/App.vue create mode 100644 video-generation/front-end/src/assets/logo.png create mode 100644 video-generation/front-end/src/components/AuthLayout.vue create mode 100644 video-generation/front-end/src/components/Sidebar.vue create mode 100644 video-generation/front-end/src/main.ts create mode 100644 video-generation/front-end/src/pages/Home.vue create mode 100644 video-generation/front-end/src/pages/SignIn.vue create mode 100644 video-generation/front-end/src/pages/SignUp.vue create mode 100644 video-generation/front-end/src/router/index.ts create mode 100644 video-generation/front-end/src/store/auth.ts create mode 100644 video-generation/front-end/src/style.css create mode 100644 video-generation/front-end/src/utils/googleAuth.ts create mode 100644 video-generation/front-end/src/views/Create.vue create mode 100644 video-generation/front-end/src/views/MyVideos.vue create mode 100644 video-generation/front-end/src/views/OAuth2Callback.vue create mode 100644 video-generation/front-end/src/views/Settings.vue create mode 100644 video-generation/front-end/src/vite-env.d.ts create mode 100644 video-generation/front-end/src/vue-shims.d.ts create mode 100644 video-generation/front-end/vite.config.ts diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eb9caab6873609baa675a9127f9d632fb331cba7 GIT binary patch literal 8196 zcmeHM-A)rh6g~@0M2Q6A4}_@n1xh6G0Sc505`Plw{Ytk>scyTq&?;Q@-gxho7rub; zC42+#eGRYl`_2q?cA$bL8lp2~=gjWT_sy9z=gjmhA`)#3nrk9UA~J)Ea())oDTVKO zohVcG$t}nTc##8XOCquKW#>fi@E}+qSRhy+SRhy+Sl}X90B1JK%!G5_ybX1*K(N4n zX#wsJWn7e1D@R7^)`3b>0LT&^Ye5@%fMUv4R;?TvsZem5>>;wy$fg*Pf#ZFd-65-1 zj*K*Li40sKJ91<*lt@PhuB_c9su~&UV1ZzPlNMm^zKCqSC8=}^`Fjg_{E_7N>!6h& zr%&Z2dbYQ-JZWTk14stjI1Uc^crm0^F z@Xq7>;Bn4k{2aYgp!QLdJCVI2D!T2V78R9AhW-uU`Bj3W50z&Ztqk`mo>SkJ$M)J| zTd{0Cuw+0~AiL11a=!U`>|Z_hIWSSX9q@I)-WqEQTNSZWpFQlt7#m9uxD<7awMu_z z<}tK9hCAp>3wQ8GdnBm&6(?0&_0{GvwCX@VdP+Qb6{a^m?yKnk3Nxeild=6{to}|> ztLcv(a?V?OG`+p;NJ@=)rs<@J8!^}dD`rI&DioF~_n zS{obC8eQmqSY%Ppf9H7q0`LR%DO!sDN>BNT#|r)2Ww?ozYsxM#v^{Osh8$WR`Ulw( zy-$nUsQ0^EH{AHbOxENst{B(>#$XJ_sv&&NW1{D~Ov@9P=m`h9qKF=_?W4`eWK1h~_+WqAzmTbG(VfLw(~cs5agcM(^VIn(v$uE|LBd`|t`#ViBE9m&LKMdOuG z#@%ioI@1q_>P5VxS0T=enwJ<2F6X==INKZ;b23nu@!nm;GY+CTCl1cUXRWn*l6QI- z_qd#i>EyMVJ#}Uty?wv^!`*j_M^?o%~UVWD%ozpG2j^Z*BIb$w@xud)T1N1^8Kn95#AP_Lmz+F0H5lrcF*oKLs7@!&^nCJo=lt{8w=XcuVQJrcIR$g*5#^v7apoS0;PXpKZ76Xf=K|~IhKL2-qe*eE- z8$1 P`w`GIIO7=js|@@A*SU_p literal 0 HcmV?d00001 diff --git a/video-generation/README.MD b/video-generation/README.MD new file mode 100644 index 0000000..35bde58 --- /dev/null +++ b/video-generation/README.MD @@ -0,0 +1,271 @@ +## 🧠 Qdrant-Powered AI Video Idea Generation + +
Qdrant + OpenAI: Making Your YouTube Channel Smarter
+ +## ✨ How Qdrant is Used +This application intelligently generates video ideas and finds related content by combining: + +- Qdrant for vector search (semantic memory of past transcripts) + +- OpenAI for embedding generation and creative idea generation + +## πŸ”Ž Step-by-Step Process +### 1. Create Embeddings +When a user uploads or processes a video transcript, we: + +- Use OpenAI’s `text-embedding-ada-002 model` to convert the text into a vector. + +- Store that vector + metadata (like `user_id`, `video_id`, etc.) inside Qdrant under the collection `video_transcripts`. + +``` +πŸš€ Function: embed_and_store(user, text, metadata) +``` +### 2. Semantic Search +When a user searches for a new video idea: + +- We embed the search query using OpenAI again. + +- Then search Qdrant to find the most similar past transcripts, filtering only for the specific user's own content. +``` +πŸ”Ž Function: search_similar_transcripts(query_text, user, top_k=10) + +``` +Flow: +``` +[Transcript Text] + ⬇ (embedding) +[Vector Embedding + Payload (including transcript)] + ➑ (store in Qdrant) + +Later... + +[Query Text] + ⬇ (embedding) +[Query Embedding] + ➑ (search Qdrant for similar vectors) + ➑ (retrieve payloads including transcripts) + ➑ (use transcripts + query to ask OpenAI to propose a new idea) + +``` +## πŸ—‚ Project Structure + +```markdwown +root/ +β”œβ”€β”€ backend/ # Django REST Framework (DRF) project +β”‚ β”œβ”€β”€ Dockerfile +β”‚ β”œβ”€β”€ docker-compose.yml +β”‚ └── (other backend code) +β”‚ +β”œβ”€β”€ frontend/ # Vue.js frontend project +β”‚ └── (Vue.js code) +└── README.md # (this file) + +``` +### 3. Creative Generation +With the top similar transcripts found: + +- We prompt OpenAI to brainstorm a fresh video idea, blending the user’s past content with the current query trend. + +- OpenAI returns a ready-to-use idea + title. +``` +✍️ Function: generate_video_idea(user, query_text, similar_payloads) +``` +## πŸ—„οΈ Qdrant Collection +We ensure the collection exists before use: +``` +Collection name: video_transcripts +Vector size: 1536 +Distance metric: COSINE +``` + + +``` +πŸ› οΈ Function: ensure_qdrant_collection() + +``` +
🎯 Thanks to Qdrant, users don't just get random content ideas. They get highly relevant, fresh, and personalized ideas based on their real content history β€” boosting channel growth smartly!
+ +## βš™οΈ Prerequisites +Before starting, ensure you have installed: + +- Docker + Docker Compose + +- Node.js + +- npm + +## πŸ› οΈ Backend Setup (`backend/`) +- Step 1: Environment Variables +- Create a `.env` file inside the `backend/` folder with your environment variables. + +- Example `.env`: +``` +DEBUG=True +SECRET_KEY=your_secret_key_here +ALLOWED_HOSTS=* +DATABASE_URL=postgres://postgres:postgres@db:5432/yourdb +``` +## Step 2: Run Backend Services +From inside the backend/ folder: +```bash +docker-compose up --build + +``` +This will: + +- Build the Django app and Postgres database + +- Start the backend server with Gunicorn at http://localhost:8000 + +- Automatically create a volume for persistent Postgres data + +## Step 3: Collect Static Files (if needed) +If you need static files immediately: +```bash +docker-compose exec web python manage.py collectstatic --noinput + +``` +## 🎨 Frontend Setup (`frontend/`) +Step 1: Install Dependencies + +```bash +npm install +``` + +## Step 2: Run the Frontend +```bash +npm run dev + +``` +This will start the Vue.js frontend, typically at http://localhost:5173/ (Vite default). + +## πŸ“‘ Connect Frontend to Backend +Update the API base URL in your Vue.js app to point to the backend: + +For example in your `frontend/src/config.js` (or wherever you configure API): +```js +export const API_BASE_URL = "http://localhost:8000"; +``` +Or use `.env` variables if your Vue project is set up for them. + +## 🌟 Production Notes +- In production, you should properly set up `CORS`, `HTTPS`, secure Gunicorn settings, and serve the frontend with Nginx or another web server. + +- Backend static files should be collected into the /staticfiles volume and served separately. + +- Consider setting `DEBUG=False` and securely managing your `.env` variables. +## πŸ›Ÿ Useful Commands +| Action | Command | +|:------|:---------| +| Run Backend | `docker-compose up --build` | +| Stop Backend | `docker-compose down` | +| Enter Backend Container | `docker-compose exec web bash` | +| Run Migrations | `docker-compose exec web python manage.py migrate` | +| Create Superuser | `docker-compose exec web python manage.py createsuperuser` | + +## 🎯 Quick URLs +- Backend API: http://localhost:8000 + +- Frontend App: http://localhost:5173 + +## πŸ“Ί YouTube API Integration + +
Upload Videos Directly to YouTube β€” Without Leaving the App!
+ +## ✨ How YouTube Upload Works +This application uses the YouTube Data API v3 to: + +- Authenticate users securely via OAuth2 + +- Upload generated videos directly to their YouTube channels + +- Set titles, descriptions, tags, privacy settings, and more + +## πŸ”‘ Authentication Flow +When a user connects their YouTube account: + +- We save their OAuth2 tokens: access token, refresh token, client ID, client secret, and scopes. + +- We use these credentials to build a YouTube client dynamically whenever uploads are needed. + +πŸ” Code Example: Building authenticated YouTube client +```python +from google.oauth2.credentials import Credentials +from googleapiclient.discovery import build + +creds = Credentials( + token=token_obj.access_token, + refresh_token=token_obj.refresh_token, + token_uri=token_obj.token_uri, + client_id=token_obj.client_id, + client_secret=token_obj.client_secret, + scopes=token_obj.scopes.split(","), +) + +youtube = build("youtube", "v3", credentials=creds) + +``` +## ⬆️ Uploading a Video +Once authenticated: +- We prepare a metadata body (title, description, tags, etc.) + +- We upload the video file using YouTube's videos.insert endpoint. + +- After successful upload, the video URL is returned, and sent to the user via email. + +πŸš€ Code Example: Uploading to YouTube +```python +body = { + "snippet": { + "title": "Your Video Title", + "description": "Video description here", + "tags": ["tag1", "tag2"], + "categoryId": "28" # e.g., Science & Technology + }, + "status": { + "privacyStatus": "public", + "madeForKids": False + } +} +media = MediaFileUpload(video_path, mimetype="video/mp4") +request = youtube.videos().insert(part="snippet,status", body=body, media_body=media) +response = request.execute() +youtube_url = f"https://youtube.com/watch?v={response['id']}" + +``` +## βš™οΈ Setting up YouTube API Credentials +Before users can connect their YouTube accounts, you must create your own YouTube OAuth2 credentials. + +πŸ“‹ Steps to create credentials: +1. Go to the Google Cloud Console. + +2. Create a new project or select an existing one. + +3. Enable the YouTube Data API v3 for your project. + +4. Create OAuth2 Client ID credentials: + +- Application type: Web Application + +- Add your app's authorized redirect URIs. + +5. Save the Client ID and Client Secret into your backend. +## πŸ”₯ Required OAuth2 Scopes: +``` +https://www.googleapis.com/auth/youtube.upload +https://www.googleapis.com/auth/youtube.readonly + +``` +
⚑ Important: You must set up OAuth consent screen, branding, and request necessary scopes for production approval if you plan to allow external users (outside your Google Cloud organization).
+ +## 🎯 Summary +- Users authenticate once. + +- Uploads happen securely in the background. + +- Uploaded videos are public, tagged, and ready to grow your channel! +## πŸ”₯ Flow Overview +
User logs in β†’ Grants YouTube access β†’ App uploads videos to their YouTube channel β†’ App returns published video URL.
+
+
✨ Thank you for using this application! +Built with Qdrant. ✨
\ No newline at end of file diff --git a/video-generation/backend/.gitignore b/video-generation/backend/.gitignore new file mode 100644 index 0000000..b3916e2 --- /dev/null +++ b/video-generation/backend/.gitignore @@ -0,0 +1,176 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache +cookies.txt +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +shorts/ \ No newline at end of file diff --git a/video-generation/backend/Dockerfile b/video-generation/backend/Dockerfile new file mode 100644 index 0000000..b04fc2a --- /dev/null +++ b/video-generation/backend/Dockerfile @@ -0,0 +1,26 @@ +# Dockerfile +FROM python:3.10-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app + +# System dependencies +RUN apt update && apt install -y ffmpeg gcc libffi-dev + +# Python dependencies +COPY requirements.txt . +RUN pip install --upgrade pip && pip install -r requirements.txt + +# Copy app and script +COPY . . +COPY django.sh /app/django.sh +RUN chmod +x /app/django.sh + +# Collect static files +RUN python manage.py collectstatic --noinput + +EXPOSE 8000 + +CMD ["/app/django.sh"] diff --git a/video-generation/backend/api/__init__.py b/video-generation/backend/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/video-generation/backend/api/admin.py b/video-generation/backend/api/admin.py new file mode 100644 index 0000000..e69de29 diff --git a/video-generation/backend/api/apps.py b/video-generation/backend/api/apps.py new file mode 100644 index 0000000..66656fd --- /dev/null +++ b/video-generation/backend/api/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'api' diff --git a/video-generation/backend/api/management/__init__.py b/video-generation/backend/api/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/video-generation/backend/api/management/commands/__init__.py b/video-generation/backend/api/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/video-generation/backend/api/management/commands/create_qdrant_collection.py b/video-generation/backend/api/management/commands/create_qdrant_collection.py new file mode 100644 index 0000000..8866b47 --- /dev/null +++ b/video-generation/backend/api/management/commands/create_qdrant_collection.py @@ -0,0 +1,9 @@ +from django.core.management.base import BaseCommand +from api.youtube_utils import ensure_qdrant_collection + +class Command(BaseCommand): + help = "Create Qdrant collection if it doesn't exist" + + def handle(self, *args, **kwargs): + ensure_qdrant_collection() + self.stdout.write(self.style.SUCCESS("βœ… Qdrant collection checked/created.")) diff --git a/video-generation/backend/api/management/commands/run_youtube_process.py b/video-generation/backend/api/management/commands/run_youtube_process.py new file mode 100644 index 0000000..0bdcfbc --- /dev/null +++ b/video-generation/backend/api/management/commands/run_youtube_process.py @@ -0,0 +1,15 @@ +from django.core.management.base import BaseCommand +from users.models import User +from api.tasks import process_youtube_channel + +class Command(BaseCommand): + help = 'Manually trigger process_youtube_channel task for a given user ID' + + def add_arguments(self, parser): + parser.add_argument('user_id', type=str) + + def handle(self, *args, **options): + user = User.objects.get(id=options['user_id']) + channel_id = user.youtube_token.channel_id + process_youtube_channel.delay(channel_id, str(user.id)) + self.stdout.write(self.style.SUCCESS(f"βœ… Task triggered for user {user.email}")) diff --git a/video-generation/backend/api/management/commands/schedule_tasks.py b/video-generation/backend/api/management/commands/schedule_tasks.py new file mode 100644 index 0000000..2493ad3 --- /dev/null +++ b/video-generation/backend/api/management/commands/schedule_tasks.py @@ -0,0 +1,35 @@ +from django.core.management.base import BaseCommand +from django_celery_beat.models import PeriodicTask, CrontabSchedule +from users.models import User +import json +import uuid + +class Command(BaseCommand): + help = 'Schedule periodic create_and_upload_video and vector DB update tasks for all users' + + def handle(self, *args, **kwargs): + schedule, _ = CrontabSchedule.objects.get_or_create(hour='*/8', minute='0') + task_id = str(uuid.uuid4()) + + for user in User.objects.all(): + # Schedule video creation + upload + PeriodicTask.objects.update_or_create( + name=f"Create Upload Video {user.id}", + defaults={ + "task": "api.tasks.generate_and_upload_youtube_short_task", + "crontab": schedule, + "args": json.dumps([str(user.id), task_id]) + } + ) + + # Schedule vector DB update + PeriodicTask.objects.update_or_create( + name=f"Update VectorDB {user.id}", + defaults={ + "task": "api.tasks.update_vectordb_from_youtube", + "crontab": schedule, + "args": json.dumps([str(user.id)]) + } + ) + + self.stdout.write(self.style.SUCCESS("βœ… Scheduled all periodic tasks for all users!")) diff --git a/video-generation/backend/api/migrations/__init__.py b/video-generation/backend/api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/video-generation/backend/api/models.py b/video-generation/backend/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/video-generation/backend/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/video-generation/backend/api/qdrant_utils.py b/video-generation/backend/api/qdrant_utils.py new file mode 100644 index 0000000..d98e576 --- /dev/null +++ b/video-generation/backend/api/qdrant_utils.py @@ -0,0 +1,63 @@ +from qdrant_client import QdrantClient +import openai +import os +from qdrant_client.http import models as rest +from openai import OpenAI + +qdrant_client = QdrantClient(url=os.getenv("QDRANT_HOST")) + +def search_similar_transcripts(query_text, user, top_k=10): + # 1️⃣ Generate the embedding for your query + openai_client = OpenAI(api_key=user.openai_api_key_decrypted) + emb_response = openai_client.embeddings.create( + input=[query_text], + model="text-embedding-ada-002" + ) + query_embedding = emb_response.data[0].embedding + + # 2️⃣ Search Qdrant using that vector + hits = qdrant_client.search( + collection_name="video_transcripts", + query_vector=query_embedding, + limit=top_k, + query_filter=rest.Filter( + must=[ + rest.FieldCondition( + key="user_id", + match=rest.MatchValue(value=str(user.id)) + ) + ] + ) + ) + + # 3️⃣ Only keep hits whose payload actually has a non‐empty "transcript" + return [hit.payload for hit in hits if hit.payload.get("transcript")] + + +def generate_video_idea(user,query_text, similar_payloads): + existing_transcripts = "\n---\n".join( + p["transcript"][:1000] for p in similar_payloads +) + prompt = f""" +You are a world-class YouTube strategist. + +Your job is to propose a brand-new video idea that is: +- Similar to existing transcript topics. +- Visually engaging. +- Potentially viral. +- Aligned with the query: "{query_text}" + +Here are related past transcripts: +{existing_transcripts} + +Return your idea in 1 short paragraph, with a unique title suggestion in quotes. +""" + + + + response = openai.chat.completions.create( + model=user.openai_model, + messages=[{"role": "user", "content": prompt}] + ) + + return response.choices[0].message.content diff --git a/video-generation/backend/api/redis_client.py b/video-generation/backend/api/redis_client.py new file mode 100644 index 0000000..f6dfd00 --- /dev/null +++ b/video-generation/backend/api/redis_client.py @@ -0,0 +1,5 @@ +import os +import redis + +redis_url = os.environ.get("REDIS_URL") +r = redis.Redis.from_url(redis_url, decode_responses=True) \ No newline at end of file diff --git a/video-generation/backend/api/tasks.py b/video-generation/backend/api/tasks.py new file mode 100644 index 0000000..05ec7df --- /dev/null +++ b/video-generation/backend/api/tasks.py @@ -0,0 +1,587 @@ +from celery import shared_task +from api.youtube_utils import get_top_video_ids, download_audio +from api.youtube_utils import embed_and_store, ensure_qdrant_collection +from api.transcription import transcribe_audio +import logging +from api.qdrant_utils import qdrant_client +from users.models import User +from users.models import Video +from qdrant_client.http import models as rest +import os, subprocess +import openai +from django.core.mail import EmailMultiAlternatives +from googleapiclient.http import MediaFileUpload +from googleapiclient.discovery import build +from .qdrant_utils import search_similar_transcripts, generate_video_idea +from api.redis_client import r +from elevenlabs import ElevenLabs +from replicate import Client as ReplicateClient +from google.oauth2.credentials import Credentials +import json + +logger = logging.getLogger(__name__) + +def send_video_upload_email(user_email, youtube_url): + subject = "🎬 New Video Uploaded to Your Channel!" + from_email = "Taledy Team " + to = [user_email] + + text_content = f"New video uploaded: {youtube_url}" + + html_content = f""" + + + + + + +
+

πŸš€ Your New Video is Live!

+

+ Hey there, your new video has just been uploaded and is ready for viewers. +

+

+ + πŸŽ₯ Watch on YouTube + +

+

+ If you didn't expect this email, you can safely ignore it. +

+
+ + + """ + + msg = EmailMultiAlternatives(subject, text_content, from_email, to) + msg.attach_alternative(html_content, "text/html") + msg.send() + +@shared_task +def process_youtube_channel(channel_id, user_id): + user = User.objects.get(id=user_id) + ensure_qdrant_collection() + video_ids = get_top_video_ids(channel_id) + + for vid in video_ids: + try: + path = download_audio(vid) + text = transcribe_audio(user, path) + embed_and_store(user, text, { + "video_id": vid, + "user_id": user_id, + "channel_id": channel_id, + "transcript": text, + }) + logger.info(f"Processed and stored video {vid}") + except Exception as e: + logger.error(f"Failed to process {vid}: {e}") + logger.info(f"Processed and stored all videos for user {user_id}") + + +@shared_task +def generate_and_upload_youtube_short_task(user_id,task_id): + log_path = os.path.join("shorts", f"make_short_{task_id}.log") + logger = logging.getLogger(f"make_short_{task_id}") + handler = logging.FileHandler(log_path) + handler.setFormatter(logging.Formatter('%(asctime)s - %(message)s')) + logger.setLevel(logging.INFO) + logger.addHandler(handler) + try: + logger.info("Received user request for short video generation") + logger.info(f"Task ID: {task_id}") + user = User.objects.get(id=user_id) + print(f"[πŸ‘€] User: {user.id}, [πŸ†”] Task ID: {task_id} landed in celery") + os.makedirs("shorts", exist_ok=True) + r.hset(f"task:{task_id}", mapping={ + "status": "starting", + "type": "transcription" + }) + + openai.api_key = user.openai_api_key_decrypted + replicate_key = user.replicate_api_key_decrypted + elevenlabs_key = user.elevenlabs_api_key_decrypted + voice_id = user.elevenlabs_voice_id + model = getattr(user, 'openai_model', None) or "gpt-4o" + + seed_prompt = f"new YouTube video idea for {user.audience}" + similar_transcripts = search_similar_transcripts(seed_prompt, user=user) + logger.info("Obtained similar transcripts") + + # 🧠 Generate unique idea based on what's already covered + idea = generate_video_idea(user,seed_prompt, similar_transcripts) + logger.info(f"Generated video idea: {idea}") + + # 1️⃣ Research with OpenAI + research_prompt = f""" + Research the following topic and provide a summary of key points, insights, and examples: + {idea} + Summarize the key points and insights in a concise format. + """ + research_response = openai.chat.completions.create( + model="gpt-4o-search-preview", + web_search_options={ + "search_context_size": "medium", + "user_location": { + "type": "approximate", + "approximate": {"country": "US"} + } + }, + messages=[{"role": "user", "content": research_prompt}] + ) + research_output = research_response.choices[0].message.content.strip() + logger.info("Obtained research output") + + # 2️⃣ Script Generation + script_prompt = f""" + You are a viral short-form content writer for TikTok and YouTube Shorts. + + Your job is to create a fast-paced, high-retention, 1-minute video script about the following topic: + {idea} + + Based on the research below: + {research_output} + + Target audience: {user.audience} + Tone: energetic, concise, and curiosity-driven. + Format: Use simple language, analogies if needed, and build toward an "aha!" moment. + Make sure the script includes: + 1. A strong hook in the first 3 seconds + 2. Fast transitions between key points (no fluff) + 3. A payoff (surprising insight, use case, or why it matters) + 4. A call to action (e.g., Subscribe for more) + Keep it under 300 words. + Output the script only, no scene directions, no emojis or headings, just the script. + """ + script_response = openai.chat.completions.create( + model=model, + max_tokens=600, + messages=[{"role": "user", "content": script_prompt}] + ) + logger.info("Obtained script") + transcript = script_response.choices[0].message.content.strip() + + # 3️⃣ Generate Voiceover + audio_path = os.path.abspath(f"shorts/{task_id}_voiceover.mp3") + logger.info("Generating voiceover") + client = ElevenLabs(api_key=elevenlabs_key, timeout=1000) + temp_audio = client.text_to_speech.convert( + text=transcript, + voice_settings={"speed": 1.2}, + voice_id=voice_id, + model_id="eleven_multilingual_v2", + output_format="mp3_44100_128", + ) + logger.info("Obtained voiceover") + with open(audio_path, "wb") as f: + for chunk_data in temp_audio: + f.write(chunk_data) + + # 4️⃣ Generate Images with Replicate (ASYNC) + import asyncio, aiohttp + import math + # Duration + logger.info("Obtaining audio duration") + result = subprocess.run([ + "ffprobe", "-v", "error", "-show_entries", + "format=duration", "-of", + "default=noprint_wrappers=1:nokey=1", audio_path + ], capture_output=True, text=True) + try: + duration = float(result.stdout.strip()) + except: + duration = 30.0 + if duration < 5: + duration = 30 + logger.info(f"Audio duration: {duration:.2f}s") + + num_images = int(duration // 5) + 1 + logger.info(f"Using {num_images} image(s)") + words = transcript.split() + words_per_chunk = math.ceil(len(words) / num_images) + logger.info(f"Approx {words_per_chunk} words per chunk.") + transcript_chunks = [ + ' '.join(words[i:i + words_per_chunk]) + for i in range(0, len(words), words_per_chunk) + ] + prompts = [f"Generate a descriptive image prompt for this transcript chunk:\n\n{chunk}" for chunk in transcript_chunks] + logger.info(f"Starting image generation for {len(prompts)} prompts...") + async def generate_images(prompts, replicate_key, task_id): + replicate_api = ReplicateClient(api_token=replicate_key) + image_paths = [] + for idx, image_prompt in enumerate(prompts): + logger.info(f"Processing image {idx + 1}/{len(prompts)}") + logger.info(f"Prompt: {image_prompt}") + image_path = os.path.abspath(f"shorts/{task_id}_{idx}.jpg") + for attempt in range(3): + try: + if not os.path.exists(image_path): + logger.info(f"Attempt {attempt+1}: Generating image {idx + 1} using FLUX") + prediction = replicate_api.predictions.create( + model=user.flux_model, + input={ + "prompt": image_prompt, + "prompt_upsampling": True, + "aspect_ratio": "9:16", + "width": 1440, + "height": 1440, + "output_format": "jpg" + } + ) + logger.info(f"Waiting for prediction {prediction.id}...") + for attempt in range(600): + prediction = replicate_api.predictions.get(prediction.id) + if prediction.status == "succeeded" and prediction.output: + image_url = prediction.output[0] if isinstance(prediction.output, list) else prediction.output + async with aiohttp.ClientSession() as session: + async with session.get(image_url) as resp: + if resp.status == 200: + with open(image_path, "wb") as f: + f.write(await resp.read()) + else: + raise Exception(f"Failed to download image: {resp.status}") + break + elif prediction.status in ["failed", "canceled"]: + logger.error(f"Prediction failed: {prediction}") + raise RuntimeError(f"Prediction failed: {prediction}") + await asyncio.sleep(1) + else: + logger.info(f"Using cached image for chunk {idx + 1}") + break + except Exception as e: + logger.error(f"Image generation failed at chunk {idx + 1}, attempt {attempt+1}: {e}") + await asyncio.sleep(2) + image_paths.append(image_path) + return image_paths + + image_paths = asyncio.run(generate_images(prompts, replicate_key, task_id)) + logger.info(f"Generated {len(image_paths)} images") + + import re + # --- SRT and chunking helpers --- + def srt_time_to_seconds(t): + h, m, s_ms = t.split(':') + s, ms = s_ms.split(',') + return int(h) * 3600 + int(m) * 60 + int(s) + int(ms) / 1000.0 + def seconds_to_srt_time(sec): + hrs = int(sec // 3600) + sec -= hrs * 3600 + mins = int(sec // 60) + sec -= mins * 60 + secs = int(sec) + ms = int(round((sec - secs) * 1000)) + return f"{hrs:02}:{mins:02}:{secs:02},{ms:03d}" + def parse_srt_blocks(raw_srt): + blocks = [] + raw_blocks = re.split(r'\n\s*\n', raw_srt.strip(), flags=re.MULTILINE) + index_pattern = re.compile(r'^(\d+)$') + time_pattern = re.compile(r'^(\d{2}:\d{2}:\d{2},\d{3}) --> (\d{2}:\d{2}:\d{2},\d{3})$') + for rb in raw_blocks: + lines = rb.strip().split('\n') + if len(lines) < 2: + continue + idx_match = index_pattern.match(lines[0].strip()) + time_match = time_pattern.match(lines[1].strip()) + if not (idx_match and time_match): + continue + block_index = int(idx_match.group(1)) + start_sec = srt_time_to_seconds(time_match.group(1)) + end_sec = srt_time_to_seconds(time_match.group(2)) + text_lines = lines[2:] + blocks.append({ + 'index': block_index, + 'start': start_sec, + 'end': end_sec, + 'lines': text_lines + }) + return blocks + def build_srt_block_str(block_index, start_sec, end_sec, text_lines): + start_str = seconds_to_srt_time(start_sec) + end_str = seconds_to_srt_time(end_sec) + text_part = "\n".join(text_lines) + return f"{block_index}\n{start_str} --> {end_str}\n{text_part}\n" + def chunk_into_few_words(line, chunk_size=2): + words = line.split() + lines = [] + for i in range(0, len(words), chunk_size): + lines.append(" ".join(words[i:i + chunk_size])) + return lines + def transform_srt_for_few_words_timed(raw_srt, chunk_size=2): + blocks = parse_srt_blocks(raw_srt) + new_blocks = [] + new_index = 1 + for b in blocks: + start = b['start'] + end = b['end'] + duration = end - start if end > start else 1 + original_text = " ".join(b['lines']) + chunked = chunk_into_few_words(original_text, chunk_size) + if len(chunked) <= 1: + new_blocks.append({ + 'index': new_index, + 'start': start, + 'end': end, + 'lines': [original_text], + }) + new_index += 1 + else: + block_duration = duration / len(chunked) + cur_start = start + for chunk_text in chunked: + cur_end = cur_start + block_duration + new_blocks.append({ + 'index': new_index, + 'start': cur_start, + 'end': cur_end, + 'lines': [chunk_text], + }) + new_index += 1 + cur_start = cur_end + new_srt = [] + for nb in new_blocks: + new_srt.append(build_srt_block_str(nb['index'], nb['start'], nb['end'], nb['lines'])) + return "\n".join(new_srt).strip() + "\n" + + # --- Animate each image with zoompan, then concatenate --- + logger.info("\nStarting video clip generation...") + video_clips = [] + for i, path in enumerate(image_paths): + out_path = os.path.abspath(f"shorts/{task_id}_clip_{i}.mp4") + logger.info(f"Processing clip {i+1}/{len(image_paths)}") + if not os.path.exists(path): + print(f"Image file does not exist: {path}") + continue + cmd = [ + "ffmpeg", "-y", "-loop", "1", "-i", path, + "-vf", "zoompan=z='min(zoom+0.0015,1.15)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125:s=576x1024,format=yuv420p", + "-frames:v", "125", "-r", "25", + "-c:v", "libx264", "-pix_fmt", "yuv420p", + out_path + ] + logger.info(f"Running ffmpeg command with zoompan effect...") + subprocess.run(cmd, check=True) + logger.info(f"Generated clip {i+1}") + video_clips.append(out_path) + logger.info(f"\nCreated {len(video_clips)} video clips") + + # Concatenate all video clips + concat_list = os.path.abspath(f"shorts/{task_id}_concat.txt") + with open(concat_list, "w") as f: + for clip in video_clips: + f.write(f"file '{os.path.abspath(clip)}'\n") + concat_path = os.path.abspath(f"shorts/{task_id}_final_video.mp4") + subprocess.run([ + "ffmpeg", "-y", "-f", "concat", "-safe", "0", + "-i", concat_list, + "-c:v", "libx264", "-pix_fmt", "yuv420p", + concat_path + ], check=True) + if not os.path.exists(concat_path): + raise Exception("Concatenated video not created") + + # Merge audio with concatenated video + logger.info("\nMerging audio with video...") + final_audio_path = os.path.abspath(f"shorts/{task_id}_with_audio.mp4") + subprocess.run([ + "ffmpeg", "-y", + "-i", concat_path, "-i", audio_path, + "-c:v", "libx264", "-pix_fmt", "yuv420p", + "-c:a", "aac", + final_audio_path + ], check=True) + if not os.path.exists(final_audio_path): + logger.error("Audio merge failed") + raise Exception("Audio merge failed") + + # Generate SRT subtitles with OpenAI Whisper + logger.info("\nGenerating SRT subtitles...") + srt_path = f"shorts/{task_id}.srt" + with open(audio_path, "rb") as audio_file: + transcript_res = openai.audio.transcriptions.create( + model="whisper-1", + file=audio_file, + response_format="srt" + ) + few_words_srt = transform_srt_for_few_words_timed(transcript_res, chunk_size=2) + logger.info("Generated SRT subtitles") + with open(srt_path, "w", encoding="utf-8") as srt_out: + srt_out.write(few_words_srt) + + # Burn captions onto video + logger.info("\nBurning captions onto video...") + final_captioned_path = os.path.abspath(f"shorts/{task_id}_animated_video.mp4") + srt_abs = os.path.abspath(srt_path) + style_str = ( + "Fontname=Arial," + "Bold=1," + "Fontsize=15," + "BorderStyle=1," + "Outline=2," + "Shadow=0," + "PrimaryColour=&H00FFFFFF," + "OutlineColour=&H00000000," + "Alignment=6," + "MarginV=120," + "MarginL=60," + "MarginR=60," + "WrapStyle=2" + ) + logger.info("Burning captions onto video...") + subtitles_filter = f"subtitles={srt_abs}:force_style='{style_str}'" + full_filter = f"{subtitles_filter},format=yuv420p" + subprocess.run([ + "ffmpeg", "-y", + "-i", final_audio_path, + "-vf", full_filter, + "-c:v", "libx264", + "-pix_fmt", "yuv420p", + "-c:a", "copy", + final_captioned_path + ], check=True) + logger.info("Burned captions onto video") + video_path = final_captioned_path + + # 6️⃣ Generate YouTube Metadata + logger.info("\nGenerating YouTube metadata...") + title_prompt = f"Generate a viral YouTube Shorts title based on this script:\n\nScript:\n{transcript}\nRespond only with the title text." + title_response = openai.chat.completions.create( + model=model, + messages=[{"role": "user", "content": title_prompt}] + ).choices[0].message.content.strip() + title = title_response if title_response else "AI Video" + logger.info(f"Generated title: {title}") + + description_prompt = f"Generate a compelling YouTube Shorts description for this script:\n\nScript:\n{transcript}\nKeep it concise and engaging. Respond only with the description." + description_response = openai.chat.completions.create( + model=model, + messages=[{"role": "user", "content": description_prompt}] + ).choices[0].message.content.strip() + description = description_response if description_response else "" + description = description_response if description_response else "" + + tags_prompt = f"Suggest 10 trending and relevant tags (comma-separated) for a YouTube Shorts video based on this script:\n\nScript:\n{transcript}\nRespond as: tag1, tag2, tag3, ..., tag10. Respond with the tags only" + tags_response = openai.chat.completions.create( + model=model, + messages=[{"role": "user", "content": tags_prompt}] + ).choices[0].message.content.strip() + tags = [tag.strip() for tag in tags_response.split(",") if tag.strip()] + logger.info(f"Generated tags: {tags}") + + # 7️⃣ Upload to YouTube + logger.info("\nUploading to YouTube...") + creds = Credentials( + token=user.youtube_token.access_token, + refresh_token=user.youtube_token.refresh_token, + token_uri=user.youtube_token.token_uri, + client_id=user.youtube_token.client_id, + client_secret=user.youtube_token.client_secret, + scopes=user.youtube_token.scopes.split(",") + ) + logger.info("YouTube credentials loaded") + youtube = build("youtube", "v3", credentials=creds) + body = { + "snippet": { + "title": title.replace('"', ''), + "description": description, + "tags": tags, + "categoryId": "28" + }, + "status": { + "privacyStatus": "public", + "madeForKids": False + } + } + logger.info("YouTube body created") + media = MediaFileUpload(video_path, mimetype="video/mp4") + logger.info("YouTube media created") + request = youtube.videos().insert(part="snippet,status", body=body, media_body=media) + logger.info("YouTube upload request created") + response = request.execute() + youtube_url = f"https://youtube.com/watch?v={response['id']}" + logger.info(f"Uploaded to YouTube: {youtube_url}") + # save to db + logger.info("Saving to database...") + Video.objects.create( + user=user, + video_url=youtube_url, + title=title, + description=description + ) + # send email + logger.info("Sending email...") + send_video_upload_email(user.email, youtube_url) + logger.info("Email sent") + result_json = { + "task_id": task_id, + "youtube_url": youtube_url, + "title": title, + "description": description, + "tags": tags, + "video_path": video_path, + "audio_path": audio_path, + "image_paths": image_paths, + "transcript": transcript, + "research_output": research_output, + } + logger.info("Task completed, saving to Redis") + r.hset(f"task:{task_id}", mapping={ + "status": "completed", + "result": json.dumps(result_json) + }) + logger.info(f"Task {task_id} completed") + logger.info("Removing logger handlers") + logger.removeHandler(handler) + handler.close() + return result_json + + except Exception as e: + logger.error(f"Failed to process: {e}") + r.hset(f"task:{task_id}", mapping={ + "status": "failed", + "type": "generate_and_upload_youtube_short", + "error": str(e) + }) + return {"error": str(e)} + +@shared_task +def update_vectordb_from_youtube(user_id): + user = User.objects.get(id=user_id) + + ensure_qdrant_collection() + + channel_id = user.youtube_token.channel_id # Make sure you're storing this! + top_video_ids = get_top_video_ids(channel_id) + + # Fetch existing video IDs from Qdrant + scroll_result = qdrant_client.scroll( + collection_name="video_transcripts", + scroll_filter=rest.Filter( + must=[ + rest.FieldCondition( + key="user_id", + match=rest.MatchValue(value=str(user.id)) + ) + ] + ), + with_payload=True, + limit=1000 + ) + + stored_video_ids = set(point.payload.get("video_id") for point in scroll_result[0]) + new_video_ids = [vid for vid in top_video_ids if vid not in stored_video_ids] + + logger.info(f"Found {len(new_video_ids)} new videos for user {user.email}") + + for vid in new_video_ids: + try: + path = download_audio(vid) + text = transcribe_audio(user, path) + embed_and_store(user, text, { + "user_id": str(user.id), + "video_id": vid, + "channel_id": channel_id, + "transcript": text, + }) + logger.info(f"βœ… Processed and stored video {vid} for user {user.email}") + except Exception as e: + logger.error(f"❌ Failed to process video {vid} for user {user.email}: {e}") diff --git a/video-generation/backend/api/tests.py b/video-generation/backend/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/video-generation/backend/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/video-generation/backend/api/transcription.py b/video-generation/backend/api/transcription.py new file mode 100644 index 0000000..f69c483 --- /dev/null +++ b/video-generation/backend/api/transcription.py @@ -0,0 +1,27 @@ +import openai +import os +import logging +logger = logging.getLogger(__name__) + +def transcribe_audio(user, file_path): + """ + Transcribe an audio file using OpenAI Whisper API. + + Parameters: + - user: The user object, optionally used for custom OpenAI API keys. + - file_path: Path to the audio file (.mp3, .wav, etc.) + + Returns: + - The transcribed text. + """ + # Optionally support per-user OpenAI key + openai.api_key = user.openai_api_key_decrypted + + with open(file_path, "rb") as audio_file: + logger.info(f"Transcribing {file_path} for user {user.id}") + response = openai.audio.transcriptions.create(model="whisper-1", file=audio_file) + transcript = response.text # Access the text attribute + logger.info("Transcription succeeded, %d characters", len(transcript)) + + + return transcript diff --git a/video-generation/backend/api/urls.py b/video-generation/backend/api/urls.py new file mode 100644 index 0000000..9ddfc28 --- /dev/null +++ b/video-generation/backend/api/urls.py @@ -0,0 +1,9 @@ +from django.urls import path +from .views import TaskStatusView, TestTaskView +from .views import GenerateAndUploadShortView + +urlpatterns = [ + path("test-task/", TestTaskView.as_view()), + path("task-status//", TaskStatusView.as_view()), + path("generate-and-upload-short/", GenerateAndUploadShortView.as_view()), +] diff --git a/video-generation/backend/api/views.py b/video-generation/backend/api/views.py new file mode 100644 index 0000000..6d8e898 --- /dev/null +++ b/video-generation/backend/api/views.py @@ -0,0 +1,71 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from celery.result import AsyncResult +from rest_framework.permissions import IsAuthenticated +from rest_framework import status +import uuid +import os +from .tasks import generate_and_upload_youtube_short_task +import logging +from api.redis_client import r + +class UserAPIKeysView(APIView): + permission_classes = [IsAuthenticated] + + def get(self, request): + user = request.user + return Response({ + "openai_api_key": user.openai_api_key_decrypted, + "replicate_api_key": user.replicate_api_key_decrypted, + "elevenlabs_api_key": user.elevenlabs_api_key_decrypted, + }) + +class TestTaskView(APIView): + def post(self, request): + task = test_celery_task.delay(2, 3) + return Response({"task_id": task.id}) + +class TaskStatusView(APIView): + def get(self, request, task_id): + result = AsyncResult(task_id) + return Response({ + "state": result.state, + "result": str(result.result) if result.ready() else None, + }, status=status.HTTP_200_OK) + +class GenerateAndUploadShortView(APIView): + permission_classes = [IsAuthenticated] + + def post(self, request): + user = request.user + try: + result = generate_and_upload_youtube_short(user.id) + return Response(result, status=status.HTTP_201_CREATED) + except Exception as e: + return Response({"error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + +def generate_and_upload_youtube_short(user_id): + task_id = str(uuid.uuid4()) + log_path = os.path.join("shorts", f"make_short_{task_id}.log") + os.makedirs("shorts", exist_ok=True) + logger = logging.getLogger(f"make_short_{task_id}") + handler = logging.FileHandler(log_path) + handler.setFormatter(logging.Formatter('%(asctime)s - %(message)s')) + logger.setLevel(logging.INFO) + logger.addHandler(handler) + + logger.info("Received user request for short video generation") + logger.info(f"Task ID: {task_id}") + r.hset(f"task:{task_id}", mapping={ + "status": "queued", + "type": "generate_and_upload_youtube_short" + }) + + task = generate_and_upload_youtube_short_task.delay(user_id, task_id) + logger.info(f"user_id = {user_id}, type = {type(user_id)}") + logger.info(f"task_id = {task_id}, type = {type(task_id)}") + + logger.info(f"Dispatched Celery task {task.id}") + logger.removeHandler(handler) + handler.close() + return {"status": "queued", "task_id": task.id} diff --git a/video-generation/backend/api/youtube_utils.py b/video-generation/backend/api/youtube_utils.py new file mode 100644 index 0000000..74e1437 --- /dev/null +++ b/video-generation/backend/api/youtube_utils.py @@ -0,0 +1,138 @@ +from googleapiclient.discovery import build +import os +import yt_dlp +from qdrant_client import QdrantClient +from qdrant_client.http.models import VectorParams, Distance, PointStruct +import os +import uuid +from openai import OpenAI +from google.oauth2.credentials import Credentials +import logging +from django.conf import settings + +logger = logging.getLogger(__name__) +# Set up basic logging configuration +logging.basicConfig( + level=logging.INFO, # or logging.DEBUG for more verbose output + format='[%(asctime)s] %(levelname)s in %(module)s: %(message)s', +) + +def get_authenticated_channel_id(token_obj): + from google.oauth2.credentials import Credentials + from googleapiclient.discovery import build + + creds = Credentials( + token=token_obj.access_token, + refresh_token=token_obj.refresh_token, + token_uri=token_obj.token_uri, + client_id=token_obj.client_id, + client_secret=token_obj.client_secret, + scopes=token_obj.scopes.split(","), + ) + + youtube = build("youtube", "v3", credentials=creds) + + response = youtube.channels().list( + part="id", + mine=True + ).execute() + + return response["items"][0]["id"] + + +def get_top_video_ids(channel_id, max_results=50): + youtube = build('youtube', 'v3', developerKey=os.getenv("YOUTUBE_API_KEY")) + res = youtube.search().list( + part="id", channelId=channel_id, order="viewCount", maxResults=max_results + ).execute() + + return [item["id"]["videoId"] for item in res["items"] if item["id"]["kind"] == "youtube#video"] + +import os +import yt_dlp + +def download_audio(video_id): + url = f"https://www.youtube.com/watch?v={video_id}" + output_dir = os.path.abspath("shorts") + os.makedirs(output_dir, exist_ok=True) + + # We set output as a template, yt-dlp will append correct extension + output_template = os.path.join(output_dir, f"{video_id}.%(ext)s") + expected_output = os.path.join(output_dir, f"{video_id}.mp3") + + print(f"[🎧] Downloading audio to: {expected_output}") + + cookiefile_path = os.path.join(settings.BASE_DIR, 'cookies.txt') + + ydl_opts = { + 'cookiefile': cookiefile_path, + 'format': 'bestaudio/best', + 'outtmpl': output_template, + 'quiet': True, + 'postprocessors': [{ + 'key': 'FFmpegExtractAudio', + 'preferredcodec': 'mp3', + 'preferredquality': '0', # Highest quality + }], + } + + with yt_dlp.YoutubeDL(ydl_opts) as ydl: + ydl.download([url]) + + if not os.path.exists(expected_output): + raise FileNotFoundError(f"Audio file not found after download: {expected_output}") + + print(f"[βœ…] Audio downloaded: {expected_output}") + return expected_output + + + +qdrant = QdrantClient(url=os.getenv("QDRANT_HOST"),prefer_grpc=False ) + +def ensure_qdrant_collection(): + if not qdrant.collection_exists("video_transcripts"): + qdrant.create_collection( + collection_name="video_transcripts", + vectors_config=VectorParams( + size=1536, + distance=Distance.COSINE + ) + ) + + +def embed_and_store(user, text, metadata): + logger.info(f"[πŸ”‘] Starting embed_and_store for user {user.id} with metadata: {metadata}") + + try: + client = OpenAI(api_key=user.openai_api_key_decrypted) + logger.info("[🧠] Initialized OpenAI client.") + except Exception as e: + logger.exception("[❌] Failed to initialize OpenAI client.") + raise e + + try: + response = client.embeddings.create( + input=[text], + model="text-embedding-ada-002" + ) + embedding = response.data[0].embedding + logger.info("[βœ…] Embedding successfully created.") + except Exception as e: + logger.exception("[❌] Failed to generate embedding.") + raise e + + try: + point_id = str(uuid.uuid4()) + logger.info(f"[πŸ†”] Generated UUID: {point_id}") + + point = PointStruct(id=point_id, vector=embedding, payload=metadata) + logger.info("[πŸ“¦] PointStruct created.") + + qdrant.upsert("video_transcripts", [point]) + logger.info(f"[πŸ“€] Upserted into Qdrant with point ID {point_id}") + + return point_id + + except Exception as e: + logger.exception("[❌] Failed to upsert into Qdrant.") + raise e diff --git a/video-generation/backend/app/__init__.py b/video-generation/backend/app/__init__.py new file mode 100644 index 0000000..cd04264 --- /dev/null +++ b/video-generation/backend/app/__init__.py @@ -0,0 +1,3 @@ +from .celery import app as celery_app + +__all__ = ['celery_app'] diff --git a/video-generation/backend/app/asgi.py b/video-generation/backend/app/asgi.py new file mode 100644 index 0000000..b6bc9f6 --- /dev/null +++ b/video-generation/backend/app/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for app project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') + +application = get_asgi_application() diff --git a/video-generation/backend/app/celery.py b/video-generation/backend/app/celery.py new file mode 100644 index 0000000..745e316 --- /dev/null +++ b/video-generation/backend/app/celery.py @@ -0,0 +1,16 @@ +import os +from celery import Celery + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') +app = Celery('app') +app.config_from_object('django.conf:settings', namespace='CELERY') +app.autodiscover_tasks() + + +# Load task modules from all registered Django app configs. +app.config_from_object('django.conf:settings', namespace='CELERY') +app.autodiscover_tasks() + +@app.task(bind=True) +def debug_task(self): + print(f'Request: {self.request!r}') \ No newline at end of file diff --git a/video-generation/backend/app/middleware.py b/video-generation/backend/app/middleware.py new file mode 100644 index 0000000..c770ed0 --- /dev/null +++ b/video-generation/backend/app/middleware.py @@ -0,0 +1,31 @@ +import os +from django.http import JsonResponse +from dotenv import load_dotenv + +load_dotenv() + +class APIKeyMiddleware: + def __init__(self, get_response): + self.get_response = get_response + self.api_key = os.getenv("X-API-KEY") + self.exempt_paths = [ + "/api/users/register/", + "/api/users/login/", + "/api/users/", + "/admin/", + "/admin/login/", + "/admin/logout/", + "/favicon.ico", + ] + + def __call__(self, request): + # Skip API key check for exempt paths + if any(request.path.startswith(path) for path in self.exempt_paths): + return self.get_response(request) + + # Check API key + key = request.headers.get("X-API-KEY") + if not key or key != self.api_key: + return JsonResponse({"detail": "Unauthorized: Invalid or missing API Key."}, status=401) + + return self.get_response(request) diff --git a/video-generation/backend/app/settings.py b/video-generation/backend/app/settings.py new file mode 100644 index 0000000..25314c9 --- /dev/null +++ b/video-generation/backend/app/settings.py @@ -0,0 +1,193 @@ +""" +Django settings for app project. + +Generated by 'django-admin startproject' using Django 5.2. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.2/ref/settings/ +""" + +from dotenv import load_dotenv +load_dotenv() +import os + +from datetime import timedelta + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + +EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" +EMAIL_HOST = "" # or use your SMTP provider +EMAIL_PORT = "" +EMAIL_HOST_USER = "" +EMAIL_HOST_PASSWORD = "" +DEFAULT_FROM_EMAIL = "" + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-c5&_2kc4emvz3%-)#+fuuu++2_%a)7f&zdy725-fb44v31_-k1' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True +from datetime import timedelta + +SIMPLE_JWT = { + "ACCESS_TOKEN_LIFETIME": timedelta(days=7), # default is 5 minutes + "REFRESH_TOKEN_LIFETIME": timedelta(days=30), # default is 1 day + "ROTATE_REFRESH_TOKENS": False, + "BLACKLIST_AFTER_ROTATION": True, + "AUTH_HEADER_TYPES": ("Bearer",), +} + + +ALLOWED_HOSTS = ["*"] + +CSRF_TRUSTED_ORIGINS = ["http://localhost:5173"] +CORS_ALLOW_CREDENTIALS = True + +CORS_ALLOW_HEADERS = [ + 'accept', + 'accept-encoding', + 'authorization', + 'content-type', + 'dnt', + 'origin', + 'user-agent', + 'x-csrftoken', + 'x-requested-with', + 'x-api-key', # Custom header for API key +] + +STATIC_URL = "/static/" +STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles") + +CELERY_BROKER_URL = os.getenv("CELERY_BROKER_URL") +CELERY_RESULT_BACKEND = os.getenv("CELERY_RESULT_BACKEND") + +CORS_ALLOWED_ORIGINS = [ + "http://localhost:5173", + +] + +EMAIL_USE_TLS = False +EMAIL_USE_SSL = False + +CELERY_ACCEPT_CONTENT = ['json'] +CELERY_TASK_SERIALIZER = 'json' +CELERY_RESULT_SERIALIZER = 'json' + +# Application definition + +INSTALLED_APPS = [ + 'corsheaders', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'rest_framework', + 'rest_framework_simplejwt', + 'django_celery_beat', + 'users', + 'api', + +] +AUTH_USER_MODEL = 'users.User' +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework_simplejwt.authentication.JWTAuthentication', + ), +} +MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'app.middleware.APIKeyMiddleware', # Custom middleware for API key validation +] + +ROOT_URLCONF = 'app.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'app.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/5.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.getenv('POSTGRES_DB'), + 'USER': os.getenv('POSTGRES_USER'), + 'PASSWORD': os.getenv('POSTGRES_PASSWORD'), + 'HOST': 'db', # service name in docker-compose + 'PORT': '5432', + } +} + + + +# Password validation +# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Default primary key field type +# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + diff --git a/video-generation/backend/app/urls.py b/video-generation/backend/app/urls.py new file mode 100644 index 0000000..922900b --- /dev/null +++ b/video-generation/backend/app/urls.py @@ -0,0 +1,25 @@ +""" +URL configuration for app project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.urls import path, include +from django.contrib import admin + +urlpatterns = [ + path('api/users/', include('users.urls')), + path("api/", include("api.urls")), + path('admin/', admin.site.urls), +] + diff --git a/video-generation/backend/app/wsgi.py b/video-generation/backend/app/wsgi.py new file mode 100644 index 0000000..121dd78 --- /dev/null +++ b/video-generation/backend/app/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for app project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') + +application = get_wsgi_application() diff --git a/video-generation/backend/compose-example.yml b/video-generation/backend/compose-example.yml new file mode 100644 index 0000000..84e9da8 --- /dev/null +++ b/video-generation/backend/compose-example.yml @@ -0,0 +1,26 @@ +version: '3.9' + +services: + web: + build: . + command: gunicorn adnari.wsgi:application --bind 0.0.0.0:8000 + env_file: + - .env + ports: + - "8000:8000" + depends_on: + - db + volumes: + - ./staticfiles:/app/staticfiles + + db: + image: postgres:15 + environment: + POSTGRES_DB: automato + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + volumes: + - postgres_data:/var/lib/postgresql/data/ + +volumes: + postgres_data: \ No newline at end of file diff --git a/video-generation/backend/django.sh b/video-generation/backend/django.sh new file mode 100644 index 0000000..573d145 --- /dev/null +++ b/video-generation/backend/django.sh @@ -0,0 +1,14 @@ +#!/bin/bash +echo "Starting Migrations..." +python manage.py migrate +echo ==================================== + +echo "Starting Server..." +python manage.py runserver 0.0.0.0:8000 +echo "Starting Migrations..." +python manage.py migrate +python manage.py schedule_tasks +echo ==================================== + +echo "Starting Server..." +python manage.py runserver 0.0.0.0:8000 \ No newline at end of file diff --git a/video-generation/backend/docker-compose.yml b/video-generation/backend/docker-compose.yml new file mode 100644 index 0000000..09e6035 --- /dev/null +++ b/video-generation/backend/docker-compose.yml @@ -0,0 +1,80 @@ +version: '3.9' + +services: + web: + build: . + command: gunicorn app.wsgi:application --bind 0.0.0.0:8000 + volumes: + - .:/app + - ./shorts:/app/shorts + - ./temp_uploads:/app/temp_uploads + - ./uploads:/app/uploads + - ./staticfiles:/app/staticfiles + ports: + - "6182:8000" + env_file: + - .env + environment: + - PYTHONPATH=/app + depends_on: + - redis + - qdrant + - db + restart: always + + celery: + build: . + command: celery -A app worker --loglevel=info + volumes: + - ./shorts:/app/shorts + - ./temp_uploads:/app/temp_uploads + - ./uploads:/app/uploads + env_file: + - .env + environment: + - PYTHONPATH=/app + depends_on: + - redis + - db + restart: always + + beat: + build: . + command: celery -A app beat --loglevel=info --scheduler django_celery_beat.schedulers:DatabaseScheduler + volumes: + - .:/app + env_file: + - .env + environment: + - PYTHONPATH=/app + depends_on: + - redis + - db + restart: always + + redis: + image: redis:7 + ports: + - "6380:6379" + restart: always + + qdrant: + image: qdrant/qdrant + ports: + - "6333:6333" + volumes: + - qdrant_storage:/qdrant/storage + restart: always + + db: + image: postgres:15 + ports: + - "5433:5432" + env_file: + - .env + volumes: + - postgres_data:/var/lib/postgresql/data + +volumes: + postgres_data: + qdrant_storage: diff --git a/video-generation/backend/env_example b/video-generation/backend/env_example new file mode 100644 index 0000000..393cd23 --- /dev/null +++ b/video-generation/backend/env_example @@ -0,0 +1,14 @@ +X-API-KEY= +DJANGO_ENCRYPTION_KEY=z +QDRANT_HOST=http://qdrant:6333 +REDIS_URL=redis://redis:6379/0 +YOUTUBE_API_KEY= +CELERY_BROKER_URL=redis://redis:6379/0 +CELERY_RESULT_BACKEND=redis://redis:6379/0 +POSTGRES_DB= +POSTGRES_USER= +POSTGRES_PASSWORD= +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +REDIRECT_URI= + diff --git a/video-generation/backend/manage.py b/video-generation/backend/manage.py new file mode 100755 index 0000000..4931389 --- /dev/null +++ b/video-generation/backend/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/video-generation/backend/requirements.txt b/video-generation/backend/requirements.txt new file mode 100644 index 0000000..a51fdfd --- /dev/null +++ b/video-generation/backend/requirements.txt @@ -0,0 +1,24 @@ +celery==5.5.1 +redis==5.2.1 +python-dotenv==1.1.0 +qdrant-client==1.14.1 +openai==1.75.0 +google-api-python-client==2.167.0 +google-auth==2.39.0 +google-auth-oauthlib==1.2.2 +requests==2.32.3 +djangorestframework==3.16.0 +django-cors-headers==3.14.0 +Django==5.2 +django-celery-beat==2.8.0 +yt-dlp==2025.3.31 +djangorestframework-simplejwt==5.5.0 +cryptography==44.0.2 +elevenlabs==1.56.0 +replicate==1.0.4 +aiohttp==3.11.18 +psycopg2-binary==2.9.10 +gunicorn==23.0.0 + + + diff --git a/video-generation/backend/users/__init__.py b/video-generation/backend/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/video-generation/backend/users/admin.py b/video-generation/backend/users/admin.py new file mode 100644 index 0000000..255e5e7 --- /dev/null +++ b/video-generation/backend/users/admin.py @@ -0,0 +1,10 @@ +from django.contrib import admin +from .models import User, YouTubeToken, Video + +admin.site.register(User) +admin.site.register(Video) + +class YouTubeTokenAdmin(admin.ModelAdmin): + list_display = ['user', 'channel_id', 'expiry'] + +admin.site.register(YouTubeToken, YouTubeTokenAdmin) diff --git a/video-generation/backend/users/apps.py b/video-generation/backend/users/apps.py new file mode 100644 index 0000000..72b1401 --- /dev/null +++ b/video-generation/backend/users/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'users' diff --git a/video-generation/backend/users/migrations/0001_initial.py b/video-generation/backend/users/migrations/0001_initial.py new file mode 100644 index 0000000..c9f9cb4 --- /dev/null +++ b/video-generation/backend/users/migrations/0001_initial.py @@ -0,0 +1,67 @@ +# Generated by Django 5.2 on 2025-04-24 12:19 + +import django.db.models.deletion +import uuid +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('email', models.EmailField(max_length=254, unique=True)), + ('is_active', models.BooleanField(default=True)), + ('is_staff', models.BooleanField(default=False)), + ('openai_api_key', models.TextField(blank=True, null=True)), + ('replicate_api_key', models.TextField(blank=True, null=True)), + ('elevenlabs_api_key', models.TextField(blank=True, null=True)), + ('openai_model', models.CharField(default='gpt-4o', max_length=255)), + ('elevenlabs_voice_id', models.CharField(blank=True, max_length=255, null=True)), + ('audience', models.CharField(blank=True, max_length=255, null=True)), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Video', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('title', models.CharField(max_length=255)), + ('description', models.TextField()), + ('video_url', models.URLField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='videos', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='YouTubeToken', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('access_token', models.TextField()), + ('refresh_token', models.TextField()), + ('token_uri', models.CharField(max_length=255)), + ('client_id', models.CharField(max_length=255)), + ('client_secret', models.CharField(max_length=255)), + ('scopes', models.TextField()), + ('channel_id', models.CharField(blank=True, max_length=255, null=True)), + ('expiry', models.DateTimeField()), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='youtube_token', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/video-generation/backend/users/migrations/0002_user_flux_model.py b/video-generation/backend/users/migrations/0002_user_flux_model.py new file mode 100644 index 0000000..d3ba67d --- /dev/null +++ b/video-generation/backend/users/migrations/0002_user_flux_model.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2 on 2025-04-24 14:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='flux_model', + field=models.CharField(default='black-forest-labs/flux-schnell', max_length=255), + ), + ] diff --git a/video-generation/backend/users/migrations/__init__.py b/video-generation/backend/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/video-generation/backend/users/models.py b/video-generation/backend/users/models.py new file mode 100644 index 0000000..7b0ff13 --- /dev/null +++ b/video-generation/backend/users/models.py @@ -0,0 +1,90 @@ +from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager +from django.db import models +import uuid + +from google.auth import default +from .utils import encrypt_value, decrypt_value + +class UserManager(BaseUserManager): + def create_user(self, email, password=None, **extra_fields): + if not email: + raise ValueError("The Email must be set") + email = self.normalize_email(email) + user = self.model(email=email, **extra_fields) + user.set_password(password) + user.save() + return user + + def create_superuser(self, email, password=None, **extra_fields): + extra_fields.setdefault("is_staff", True) + extra_fields.setdefault("is_superuser", True) + return self.create_user(email, password, **extra_fields) + +class User(AbstractBaseUser, PermissionsMixin): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + email = models.EmailField(unique=True) + is_active = models.BooleanField(default=True) + is_staff = models.BooleanField(default=False) + + # Optional: storing OpenAI, Replicate, ElevenLabs keys per user + openai_api_key = models.TextField(null=True, blank=True) + replicate_api_key = models.TextField(null=True, blank=True) + elevenlabs_api_key = models.TextField(null=True, blank=True) + openai_model = models.CharField(max_length=255, default='gpt-4o') + elevenlabs_voice_id = models.CharField(max_length=255, null=True, blank=True) + audience = models.TextField(null=True, blank=True) + flux_model = models.CharField(max_length=255, default="black-forest-labs/flux-schnell") + + objects = UserManager() + + USERNAME_FIELD = "email" + REQUIRED_FIELDS = [] + + def save(self, *args, **kwargs): + # Encrypt keys before saving + if self.openai_api_key and not self.openai_api_key.startswith('gAAAA'): + self.openai_api_key = encrypt_value(self.openai_api_key) + if self.replicate_api_key and not self.replicate_api_key.startswith('gAAAA'): + self.replicate_api_key = encrypt_value(self.replicate_api_key) + if self.elevenlabs_api_key and not self.elevenlabs_api_key.startswith('gAAAA'): + self.elevenlabs_api_key = encrypt_value(self.elevenlabs_api_key) + super().save(*args, **kwargs) + + @property + def openai_api_key_decrypted(self): + return decrypt_value(self.openai_api_key) + + @property + def replicate_api_key_decrypted(self): + return decrypt_value(self.replicate_api_key) + + @property + def elevenlabs_api_key_decrypted(self): + return decrypt_value(self.elevenlabs_api_key) + + def __str__(self): + return self.email + +class YouTubeToken(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="youtube_token") + access_token = models.TextField() + refresh_token = models.TextField() + token_uri = models.CharField(max_length=255) + client_id = models.CharField(max_length=255) + client_secret = models.CharField(max_length=255) + scopes = models.TextField() + channel_id = models.CharField(max_length=255, null=True, blank=True) + expiry = models.DateTimeField() + + +class Video(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="videos") + title = models.CharField(max_length=255) + description = models.TextField() + video_url = models.URLField() + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.title \ No newline at end of file diff --git a/video-generation/backend/users/serializers.py b/video-generation/backend/users/serializers.py new file mode 100644 index 0000000..d311462 --- /dev/null +++ b/video-generation/backend/users/serializers.py @@ -0,0 +1,86 @@ +from rest_framework import serializers +from .models import User +from django.contrib.auth import authenticate +from .models import YouTubeToken +from .models import Video +from rest_framework import generics, permissions + + +class VideoSerializer(serializers.ModelSerializer): + class Meta: + model = Video + fields = ['id', 'title', 'description', 'video_url', 'created_at'] + read_only_fields = ['id', 'created_at'] + + +class VideoListCreateView(generics.ListCreateAPIView): + serializer_class = VideoSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_queryset(self): + return Video.objects.filter(user=self.request.user).order_by('-created_at') + + def perform_create(self, serializer): + serializer.save(user=self.request.user) + +class RegisterSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ['email', 'password'] + extra_kwargs = {'password': {'write_only': True}} + + def create(self, validated_data): + return User.objects.create_user(**validated_data) + +class LoginSerializer(serializers.Serializer): + email = serializers.EmailField() + password = serializers.CharField(write_only=True) + + def validate(self, data): + user = authenticate(**data) + if user and user.is_active: + return user + raise serializers.ValidationError("Invalid credentials") + +class YouTubeTokenSerializer(serializers.ModelSerializer): + class Meta: + model = YouTubeToken + fields = "__all__" + read_only_fields = ['user'] + +class UpdateAPIKeysSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = [ + 'openai_api_key', + 'replicate_api_key', + 'elevenlabs_api_key', + 'openai_model', + 'elevenlabs_voice_id', + 'audience', + 'flux_model', + ] + extra_kwargs = { + 'openai_api_key': {'write_only': True}, + 'replicate_api_key': {'write_only': True}, + 'elevenlabs_api_key': {'write_only': True}, + } + + +class UserAPIKeysSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = [ + "openai_api_key", + "replicate_api_key", + "elevenlabs_api_key", + "openai_model", + "elevenlabs_voice_id", + "audience", + "flux_model", + ] + extra_kwargs = { + "openai_api_key": {"read_only": True}, + "replicate_api_key": {"read_only": True}, + "elevenlabs_api_key": {"read_only": True}, + } \ No newline at end of file diff --git a/video-generation/backend/users/tests.py b/video-generation/backend/users/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/video-generation/backend/users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/video-generation/backend/users/urls.py b/video-generation/backend/users/urls.py new file mode 100644 index 0000000..7cdd49b --- /dev/null +++ b/video-generation/backend/users/urls.py @@ -0,0 +1,21 @@ +from django.urls import path +from .views import RegisterView, LoginView +from .views import SaveYouTubeTokenView +from .views import VideoListCreateView, VideoRetrieveUpdateDestroyView +from .views import UpdateAPIKeysView +from .views import UserAPIKeysView +from .views import YouTubeOAuthCallbackView + +urlpatterns = [ + path('register/', RegisterView.as_view(), name='register'), + path('login/', LoginView.as_view(), name='login'), + path("youtube/token/", SaveYouTubeTokenView.as_view(), name="save-youtube-token"), + path("youtube/callback/", YouTubeOAuthCallbackView.as_view(), name="youtube-oauth-callback"), + + path("videos/", VideoListCreateView.as_view(), name="video-list-create"), + path('videos//', VideoRetrieveUpdateDestroyView.as_view(), name='video-detail'), + path('update-keys/', UpdateAPIKeysView.as_view(), name='update-api-keys'), + path("api-keys/", UserAPIKeysView.as_view(), name="get-api-keys"), + +] + diff --git a/video-generation/backend/users/utils.py b/video-generation/backend/users/utils.py new file mode 100644 index 0000000..8ff9d63 --- /dev/null +++ b/video-generation/backend/users/utils.py @@ -0,0 +1,24 @@ +import os +from cryptography.fernet import Fernet, InvalidToken + +def get_fernet(): + key = os.getenv('DJANGO_ENCRYPTION_KEY') + print("πŸ” Loaded Fernet key:") + if not key: + raise ValueError("Missing DJANGO_ENCRYPTION_KEY in environment.") + return Fernet(key) + +def encrypt_value(value): + if not value: + return None + f = get_fernet() + return f.encrypt(value.encode()).decode() + +def decrypt_value(value): + if not value: + return None + try: + f = get_fernet() + return f.decrypt(value.encode()).decode() + except InvalidToken: + return "[DECRYPTION_FAILED]" diff --git a/video-generation/backend/users/views.py b/video-generation/backend/users/views.py new file mode 100644 index 0000000..48d60fc --- /dev/null +++ b/video-generation/backend/users/views.py @@ -0,0 +1,183 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +from .serializers import RegisterSerializer, LoginSerializer +from rest_framework_simplejwt.tokens import RefreshToken +from api.youtube_utils import get_authenticated_channel_id +from rest_framework import generics, permissions +from .models import Video +from .serializers import VideoSerializer +from .models import YouTubeToken +from .serializers import YouTubeTokenSerializer +from rest_framework.permissions import IsAuthenticated +from api.tasks import process_youtube_channel +from .serializers import UpdateAPIKeysSerializer +from .serializers import UserAPIKeysSerializer + + +import requests +from django.utils.dateparse import parse_datetime +from django.utils import timezone +import os + +from google.auth.transport.requests import Request +from google.oauth2.credentials import Credentials +from datetime import datetime, timedelta + +GOOGLE_CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID") +GOOGLE_CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET") +REDIRECT_URI = os.getenv("REDIRECT_URI") + +class YouTubeOAuthCallbackView(APIView): + permission_classes = [IsAuthenticated] + + def post(self, request): + code = request.data.get("code") + if not code: + return Response({"error": "Missing code"}, status=400) + + token_url = "https://oauth2.googleapis.com/token" + data = { + "code": code, + "client_id": request.data.get("client_id"), + "client_secret": request.data.get("client_secret"), + "redirect_uri": request.data.get("redirect_uri"), + "grant_type": "authorization_code" + } + + token_response = requests.post(token_url, data=data) + if not token_response.ok: + return Response({"error": "Failed to fetch tokens", "details": token_response.json()}, status=400) + + token_data = token_response.json() + + # Store in DB + token_obj, _ = YouTubeToken.objects.update_or_create( + user=request.user, + defaults={ + "access_token": token_data["access_token"], + "refresh_token": token_data.get("refresh_token"), + "token_uri": "https://oauth2.googleapis.com/token", + "client_id": data["client_id"], + "client_secret": data["client_secret"], + "scopes": "https://www.googleapis.com/auth/youtube.upload https://www.googleapis.com/auth/youtube.readonly", + "expiry": datetime.utcnow() + timedelta(seconds=token_data["expires_in"]) + } + ) + + return Response({"message": "Token saved successfully"}) + +class RegisterView(APIView): + def post(self, request): + serializer = RegisterSerializer(data=request.data) + if serializer.is_valid(): + user = serializer.save() + refresh = RefreshToken.for_user(user) + return Response({ + "refresh": str(refresh), + "access": str(refresh.access_token), + }, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class LoginView(APIView): + def post(self, request): + serializer = LoginSerializer(data=request.data) + if serializer.is_valid(): + user = serializer.validated_data + refresh = RefreshToken.for_user(user) + return Response({ + "refresh": str(refresh), + "access": str(refresh.access_token), + }) + return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED) + +class SaveYouTubeTokenView(generics.GenericAPIView): + permission_classes = [IsAuthenticated] + + def post(self, request, *args, **kwargs): + code = request.data.get('code') + if not code: + return Response({"detail": "Missing authorization code."}, status=status.HTTP_400_BAD_REQUEST) + + try: + # Exchange code for tokens + token_url = "https://oauth2.googleapis.com/token" + data = { + "code": code, + "client_id": GOOGLE_CLIENT_ID, + "client_secret": GOOGLE_CLIENT_SECRET, + "redirect_uri": REDIRECT_URI, + "grant_type": "authorization_code", + } + token_response = requests.post(token_url, data=data) + token_response.raise_for_status() + token_data = token_response.json() + + access_token = token_data.get("access_token") + refresh_token = token_data.get("refresh_token") + token_uri = token_url + scopes = token_data.get("scope") + expires_in = token_data.get("expires_in") # seconds + + expiry = timezone.now() + timezone.timedelta(seconds=expires_in) + + # Save to database + youtube_token, created = YouTubeToken.objects.update_or_create( + user=request.user, + defaults={ + "access_token": access_token, + "refresh_token": refresh_token, + "token_uri": token_uri, + "client_id": GOOGLE_CLIENT_ID, + "client_secret": GOOGLE_CLIENT_SECRET, + "scopes": scopes, + "expiry": expiry, + } + ) + + # Fetch channel ID and update + try: + channel_id = get_authenticated_channel_id(youtube_token) + youtube_token.channel_id = channel_id + youtube_token.save() + + process_youtube_channel.delay(channel_id, str(request.user.id)) + except Exception as e: + print(f"⚠️ Failed to fetch channel ID: {e}") + + return Response({"detail": "YouTube token saved successfully."}, status=status.HTTP_200_OK) + + except requests.exceptions.RequestException as e: + print(f"⚠️ Failed to exchange code: {e}") + return Response({"detail": "Failed to exchange code for tokens."}, status=status.HTTP_400_BAD_REQUEST) + +class VideoRetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView): + serializer_class = VideoSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_queryset(self): + return Video.objects.filter(user=self.request.user) + +class VideoListCreateView(generics.ListCreateAPIView): + serializer_class = VideoSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_queryset(self): + return Video.objects.filter(user=self.request.user).order_by('-created_at') + + def perform_create(self, serializer): + serializer.save(user=self.request.user) + +class UpdateAPIKeysView(generics.UpdateAPIView): + serializer_class = UpdateAPIKeysSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_object(self): + return self.request.user + +class UserAPIKeysView(generics.RetrieveAPIView): + serializer_class = UserAPIKeysSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_object(self): + return self.request.user \ No newline at end of file diff --git a/video-generation/front-end/.gitignore b/video-generation/front-end/.gitignore new file mode 100644 index 0000000..5075aa6 --- /dev/null +++ b/video-generation/front-end/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +dist +dist.zip +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/video-generation/front-end/.vscode/extensions.json b/video-generation/front-end/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/video-generation/front-end/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/video-generation/front-end/README.md b/video-generation/front-end/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/video-generation/front-end/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/video-generation/front-end/public/vite.svg b/video-generation/front-end/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/video-generation/front-end/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/video-generation/front-end/src/App.vue b/video-generation/front-end/src/App.vue new file mode 100644 index 0000000..3211013 --- /dev/null +++ b/video-generation/front-end/src/App.vue @@ -0,0 +1,61 @@ + + + + + + + + diff --git a/video-generation/front-end/src/assets/logo.png b/video-generation/front-end/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2561160522d582c2f4bcb0c1b74bec1b181e04 GIT binary patch literal 244074 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�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 + +

+ + + diff --git a/video-generation/front-end/src/components/Sidebar.vue b/video-generation/front-end/src/components/Sidebar.vue new file mode 100644 index 0000000..6f50a89 --- /dev/null +++ b/video-generation/front-end/src/components/Sidebar.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/video-generation/front-end/src/main.ts b/video-generation/front-end/src/main.ts new file mode 100644 index 0000000..b414484 --- /dev/null +++ b/video-generation/front-end/src/main.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' +import { createPinia } from 'pinia' +import router from './router' + +const app = createApp(App) +app.use(createPinia()) +app.use(router) +app.mount('#app') diff --git a/video-generation/front-end/src/pages/Home.vue b/video-generation/front-end/src/pages/Home.vue new file mode 100644 index 0000000..11167a5 --- /dev/null +++ b/video-generation/front-end/src/pages/Home.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/video-generation/front-end/src/pages/SignIn.vue b/video-generation/front-end/src/pages/SignIn.vue new file mode 100644 index 0000000..948b17b --- /dev/null +++ b/video-generation/front-end/src/pages/SignIn.vue @@ -0,0 +1,40 @@ + + + diff --git a/video-generation/front-end/src/pages/SignUp.vue b/video-generation/front-end/src/pages/SignUp.vue new file mode 100644 index 0000000..35ac45e --- /dev/null +++ b/video-generation/front-end/src/pages/SignUp.vue @@ -0,0 +1,40 @@ + + + diff --git a/video-generation/front-end/src/router/index.ts b/video-generation/front-end/src/router/index.ts new file mode 100644 index 0000000..1c8f8f8 --- /dev/null +++ b/video-generation/front-end/src/router/index.ts @@ -0,0 +1,66 @@ +import { createRouter, createWebHistory } from 'vue-router'; +import type { RouteRecordRaw } from 'vue-router'; +import SignIn from '../pages/SignIn.vue'; +import SignUp from '../pages/SignUp.vue'; +import Home from '../pages/Home.vue'; +import { useAuthStore } from '../store/auth'; + +const routes: Array = [ + // ...existing routes + { + path: '/settings', + name: 'Settings', + component: () => import('../views/Settings.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/my-videos', + name: 'MyVideos', + component: () => import('../views/MyVideos.vue'), + meta: { requiresAuth: true }, + }, + { path: '/signin', name: 'SignIn', component: SignIn }, + { path: '/signup', name: 'SignUp', component: SignUp }, + { + path: '/oauth2callback', + name: 'OAuth2Callback', + component: () => import('../views/OAuth2Callback.vue'), + meta: { requiresAuth: true } + }, + { + path: '/', + name: 'Home', + component: Home, + meta: { requiresAuth: true }, + }, + { + path: '/create', + name: 'Create', + component: () => import('../views/Create.vue'), + meta: { requiresAuth: true, requiresSubscription: true }, + }, +]; + +const router = createRouter({ + history: createWebHistory(), + routes, +}); + +router.beforeEach(async (to, _, next) => { + const auth = useAuthStore(); + if (to.meta.requiresAuth && !auth.isAuthenticated) { + next({ name: 'SignIn' }); + return; + } + if (to.meta.requiresSubscription) { + const accessToken = localStorage.getItem('accessToken'); + if (!accessToken) { + next({ name: 'SignIn' }); + return; + } + + } + next(); +}); + +export default router; diff --git a/video-generation/front-end/src/store/auth.ts b/video-generation/front-end/src/store/auth.ts new file mode 100644 index 0000000..e85a91f --- /dev/null +++ b/video-generation/front-end/src/store/auth.ts @@ -0,0 +1,57 @@ +import { defineStore } from 'pinia'; +import axios from 'axios'; + +export const useAuthStore = defineStore('auth', { + state: () => ({ + accessToken: localStorage.getItem('accessToken') || null, + refreshToken: localStorage.getItem('refreshToken') || null, + isAuthenticated: !!localStorage.getItem('accessToken'), + loading: false, + error: null as string | null, + }), + actions: { + async login(email: string, password: string) { + this.loading = true; + this.error = null; + try { + const res = await axios.post('/api/users/login/', { email, password }); + this.accessToken = res.data.access; + this.refreshToken = res.data.refresh; + this.isAuthenticated = true; + localStorage.setItem('accessToken', res.data.access); + localStorage.setItem('refreshToken', res.data.refresh); + } catch (err) { + if (typeof err === 'object' && err !== null && 'response' in err) { + this.error = (err as any).response?.data?.message || 'Login failed'; + } else { + this.error = 'Login failed'; + } + this.isAuthenticated = false; + } finally { + this.loading = false; + } + }, + async register(email: string, password: string) { + this.loading = true; + this.error = null; + try { + await axios.post('/api/users/register/', { email, password }); + } catch (err) { + if (typeof err === 'object' && err !== null && 'response' in err) { + this.error = (err as any).response?.data?.message || 'Signup failed'; + } else { + this.error = 'Signup failed'; + } + } finally { + this.loading = false; + } + }, + logout() { + this.accessToken = null; + this.refreshToken = null; + this.isAuthenticated = false; + localStorage.removeItem('accessToken'); + localStorage.removeItem('refreshToken'); + }, + }, +}); diff --git a/video-generation/front-end/src/style.css b/video-generation/front-end/src/style.css new file mode 100644 index 0000000..f99ff17 --- /dev/null +++ b/video-generation/front-end/src/style.css @@ -0,0 +1,90 @@ +@import "tailwindcss"; + +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + min-width: 320px; + min-height: 100vh; + width: 100vw; + display: block; + background: #242424; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +.card { + padding: 2em; +} + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +/* Make Home.vue full width when .home-page is present */ +#app.home-page { + max-width: none !important; + margin: 0 !important; + padding: 0 !important; + text-align: initial !important; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/video-generation/front-end/src/utils/googleAuth.ts b/video-generation/front-end/src/utils/googleAuth.ts new file mode 100644 index 0000000..a8177fb --- /dev/null +++ b/video-generation/front-end/src/utils/googleAuth.ts @@ -0,0 +1,22 @@ +// src/utils/googleAuth.ts +export const GOOGLE_CLIENT_ID = import.meta.env.VITE_GOOGLE_CLIENT_ID +export const REDIRECT_URI = import.meta.env.VITE_REDIRECT_URI; // Must match your Google console settings +export const SCOPES = [ + "https://www.googleapis.com/auth/youtube.upload", + "https://www.googleapis.com/auth/youtube.readonly" +]; +// src/utils/googleAuth.ts +export function buildGoogleAuthUrl(): string { + const baseUrl = "https://accounts.google.com/o/oauth2/v2/auth"; + const params = new URLSearchParams({ + client_id: GOOGLE_CLIENT_ID, + redirect_uri: REDIRECT_URI, + response_type: "code", + access_type: "offline", // needed to get refresh_token + prompt: "consent", // force refresh scope prompt + scope: SCOPES.join(" ") + }); + + return `${baseUrl}?${params.toString()}`; + } + \ No newline at end of file diff --git a/video-generation/front-end/src/views/Create.vue b/video-generation/front-end/src/views/Create.vue new file mode 100644 index 0000000..e1ecd77 --- /dev/null +++ b/video-generation/front-end/src/views/Create.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/video-generation/front-end/src/views/MyVideos.vue b/video-generation/front-end/src/views/MyVideos.vue new file mode 100644 index 0000000..bb9c8e9 --- /dev/null +++ b/video-generation/front-end/src/views/MyVideos.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/video-generation/front-end/src/views/OAuth2Callback.vue b/video-generation/front-end/src/views/OAuth2Callback.vue new file mode 100644 index 0000000..b71cd00 --- /dev/null +++ b/video-generation/front-end/src/views/OAuth2Callback.vue @@ -0,0 +1,57 @@ + + + + + + + diff --git a/video-generation/front-end/src/views/Settings.vue b/video-generation/front-end/src/views/Settings.vue new file mode 100644 index 0000000..bda3bcc --- /dev/null +++ b/video-generation/front-end/src/views/Settings.vue @@ -0,0 +1,267 @@ + + + \ No newline at end of file diff --git a/video-generation/front-end/src/vite-env.d.ts b/video-generation/front-end/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/video-generation/front-end/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/video-generation/front-end/src/vue-shims.d.ts b/video-generation/front-end/src/vue-shims.d.ts new file mode 100644 index 0000000..40d71cc --- /dev/null +++ b/video-generation/front-end/src/vue-shims.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; + } \ No newline at end of file diff --git a/video-generation/front-end/vite.config.ts b/video-generation/front-end/vite.config.ts new file mode 100644 index 0000000..7da44a8 --- /dev/null +++ b/video-generation/front-end/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from '@tailwindcss/vite' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue(), tailwindcss(), + ], + +}) From f50db153299752e1ec1ed3300d6324601c219745 Mon Sep 17 00:00:00 2001 From: Derrick Mwiti <10187095+mwitiderrick@users.noreply.github.com> Date: Wed, 30 Apr 2025 18:26:46 +0300 Subject: [PATCH 2/2] Update video-generation/README.MD Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- video-generation/README.MD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/video-generation/README.MD b/video-generation/README.MD index 35bde58..54a4e3e 100644 --- a/video-generation/README.MD +++ b/video-generation/README.MD @@ -49,7 +49,7 @@ Later... ``` ## πŸ—‚ Project Structure -```markdwown +```markdown root/ β”œβ”€β”€ backend/ # Django REST Framework (DRF) project β”‚ β”œβ”€β”€ Dockerfile