From afdfe1dbac9419ad160e23d82f0351f9ffa06294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pelletier?= Date: Wed, 14 May 2025 02:04:13 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Add=20feature:=20Separate=20conv?= =?UTF-8?q?ersion=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/config.py | 65 ++++++++++++++++ backend/app/convert/__init__.py | 0 backend/app/convert/convert_bluesky_car.py | 10 +++ backend/app/convert/convert_export_txt.py | 10 +++ .../convert/convert_facebook_comments_json.py | 10 +++ .../convert/convert_facebook_posts_json.py | 10 +++ .../convert_instagram_comments_json.py | 10 +++ .../convert/convert_instagram_posts_json.py | 10 +++ .../convert/convert_instagram_reels_json.py | 10 +++ .../convert/convert_instagram_reels_video.py | 10 +++ .../convert_instagram_stories_image.py | 10 +++ .../convert/convert_instagram_stories_json.py | 10 +++ .../convert/convert_linkedin_comments_csv.py | 10 +++ .../convert/convert_linkedin_shares_csv.py | 10 +++ backend/app/convert/convert_markdown_txt.py | 10 +++ .../convert/convert_youtube_shorts_video.py | 10 +++ .../convert/convert_youtube_video_video.py | 10 +++ backend/app/models.py | 46 ++++++++---- backend/app/routers/convert_router.py | 74 ++++++++++++++++++- 19 files changed, 318 insertions(+), 17 deletions(-) create mode 100644 backend/app/convert/__init__.py create mode 100644 backend/app/convert/convert_bluesky_car.py create mode 100644 backend/app/convert/convert_export_txt.py create mode 100644 backend/app/convert/convert_facebook_comments_json.py create mode 100644 backend/app/convert/convert_facebook_posts_json.py create mode 100644 backend/app/convert/convert_instagram_comments_json.py create mode 100644 backend/app/convert/convert_instagram_posts_json.py create mode 100644 backend/app/convert/convert_instagram_reels_json.py create mode 100644 backend/app/convert/convert_instagram_reels_video.py create mode 100644 backend/app/convert/convert_instagram_stories_image.py create mode 100644 backend/app/convert/convert_instagram_stories_json.py create mode 100644 backend/app/convert/convert_linkedin_comments_csv.py create mode 100644 backend/app/convert/convert_linkedin_shares_csv.py create mode 100644 backend/app/convert/convert_markdown_txt.py create mode 100644 backend/app/convert/convert_youtube_shorts_video.py create mode 100644 backend/app/convert/convert_youtube_video_video.py diff --git a/backend/app/config.py b/backend/app/config.py index 093c753..906ea61 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -11,5 +11,70 @@ available_sources = AvailableSourcesResponse( name="linkedin_shares", format="csv", ), + AvailableSource( + display_name="LinkedIn Comments", + name="linkedin_comments", + format="csv", + ), + AvailableSource( + display_name="Facebook Posts", name="facebook_posts", format="json" + ), + AvailableSource( + display_name="Facebook Comments", + name="facebook_comments", + format="json", + ), + AvailableSource( + display_name="Instagram Posts", + name="instagram_posts", + format="json", + ), + AvailableSource( + display_name="Instagram Comments", + name="instagram_comments", + format="json", + ), + AvailableSource( + display_name="Instagram Stories", + name="instagram_stories", + format="json", + ), + AvailableSource( + display_name="Instagram Reels", + name="instagram_reels", + format="json", + ), + AvailableSource( + display_name="Instagram Stories", + name="instagram_stories", + format="image", + ), + AvailableSource( + display_name="Instagram Reels", + name="instagram_reels", + format="video", + ), + AvailableSource(display_name="Bluesky", name="bluesky", format="car"), + AvailableSource( + display_name="Youtube Video", name="youtube_video", format="video" + ), + AvailableSource( + display_name="Youtube Shorts", + name="youtube_shorts", + format="video", + ), + AvailableSource( + display_name="Markdown", name="markdown", format="markdown" + ), + AvailableSource( + display_name="Wordpress", name="wordpress_xml", format="xml" + ), + AvailableSource(display_name="Ebook", name="ebook_pdf", format="pdf"), + AvailableSource( + display_name="Ebook", name="ebook_epub", format="epub" + ), + AvailableSource( + display_name="Website", name="ebook_html", format="html" + ), ], ) diff --git a/backend/app/convert/__init__.py b/backend/app/convert/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/convert/convert_bluesky_car.py b/backend/app/convert/convert_bluesky_car.py new file mode 100644 index 0000000..14f2bc8 --- /dev/null +++ b/backend/app/convert/convert_bluesky_car.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_bluesky_car(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_export_txt.py b/backend/app/convert/convert_export_txt.py new file mode 100644 index 0000000..474ccc0 --- /dev/null +++ b/backend/app/convert/convert_export_txt.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_export_txt(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_facebook_comments_json.py b/backend/app/convert/convert_facebook_comments_json.py new file mode 100644 index 0000000..01b66b6 --- /dev/null +++ b/backend/app/convert/convert_facebook_comments_json.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_facebook_comments_json(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_facebook_posts_json.py b/backend/app/convert/convert_facebook_posts_json.py new file mode 100644 index 0000000..ee789f9 --- /dev/null +++ b/backend/app/convert/convert_facebook_posts_json.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_facebook_posts_json(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_instagram_comments_json.py b/backend/app/convert/convert_instagram_comments_json.py new file mode 100644 index 0000000..58c499f --- /dev/null +++ b/backend/app/convert/convert_instagram_comments_json.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_instagram_comments_json(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_instagram_posts_json.py b/backend/app/convert/convert_instagram_posts_json.py new file mode 100644 index 0000000..a6fdf51 --- /dev/null +++ b/backend/app/convert/convert_instagram_posts_json.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_instagram_posts_json(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_instagram_reels_json.py b/backend/app/convert/convert_instagram_reels_json.py new file mode 100644 index 0000000..8e9e444 --- /dev/null +++ b/backend/app/convert/convert_instagram_reels_json.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_instagram_reels_json(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_instagram_reels_video.py b/backend/app/convert/convert_instagram_reels_video.py new file mode 100644 index 0000000..0491a5e --- /dev/null +++ b/backend/app/convert/convert_instagram_reels_video.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_instagram_reels_video(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_instagram_stories_image.py b/backend/app/convert/convert_instagram_stories_image.py new file mode 100644 index 0000000..a6292f6 --- /dev/null +++ b/backend/app/convert/convert_instagram_stories_image.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_instagram_stories_image(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_instagram_stories_json.py b/backend/app/convert/convert_instagram_stories_json.py new file mode 100644 index 0000000..04c8703 --- /dev/null +++ b/backend/app/convert/convert_instagram_stories_json.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_instagram_stories_json(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_linkedin_comments_csv.py b/backend/app/convert/convert_linkedin_comments_csv.py new file mode 100644 index 0000000..2439d0d --- /dev/null +++ b/backend/app/convert/convert_linkedin_comments_csv.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_linkedin_comments_csv(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_linkedin_shares_csv.py b/backend/app/convert/convert_linkedin_shares_csv.py new file mode 100644 index 0000000..1cd805d --- /dev/null +++ b/backend/app/convert/convert_linkedin_shares_csv.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_linkedin_shares_csv(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_markdown_txt.py b/backend/app/convert/convert_markdown_txt.py new file mode 100644 index 0000000..2c6d9fd --- /dev/null +++ b/backend/app/convert/convert_markdown_txt.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_markdown_txt(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_youtube_shorts_video.py b/backend/app/convert/convert_youtube_shorts_video.py new file mode 100644 index 0000000..db1dc21 --- /dev/null +++ b/backend/app/convert/convert_youtube_shorts_video.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_youtube_shorts_video(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/convert/convert_youtube_video_video.py b/backend/app/convert/convert_youtube_video_video.py new file mode 100644 index 0000000..2054968 --- /dev/null +++ b/backend/app/convert/convert_youtube_video_video.py @@ -0,0 +1,10 @@ +from app.config import logger +from app.models import ConversionResponse +from fastapi import UploadFile + + +def convert_youtube_video_video(file: UploadFile): + # Implement conversion logic here + logger.info(file.headers) + converted_data = {} # Example data + return ConversionResponse(converted_data=converted_data, status="success") diff --git a/backend/app/models.py b/backend/app/models.py index 7e9d08e..25c41d3 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -1,6 +1,7 @@ -from typing import Dict, List +from typing import Annotated, Dict, List -from pydantic import BaseModel +from fastapi import Form, UploadFile +from pydantic import BaseModel, model_validator class AnalysisRequest(BaseModel): @@ -12,9 +13,36 @@ class AnalysisResponse(BaseModel): result: str +class AvailableSource(BaseModel): + display_name: str + name: str + format: str + + +class AvailableSourcesResponse(BaseModel): + sources: List[AvailableSource] + + class ConversionRequest(BaseModel): - source_type: str - source_data: str + source_name: Annotated[str, Form()] + source_format: Annotated[str, Form()] + file: UploadFile + + def __init__( + self, + source_name: Annotated[str, Form()], + source_format: Annotated[str, Form()], + file: UploadFile, + ): + super().__init__( + source_name=source_name, source_format=source_format, file=file + ) + + @model_validator(mode="after") + def validate(self): + if not self.source_format: + self.source_format = "txt" + return self class ConversionResponse(BaseModel): @@ -48,13 +76,3 @@ class ImportRequest(BaseModel): class ImportResponse(BaseModel): status: str - - -class AvailableSource(BaseModel): - display_name: str - name: str - format: str - - -class AvailableSourcesResponse(BaseModel): - sources: List[AvailableSource] diff --git a/backend/app/routers/convert_router.py b/backend/app/routers/convert_router.py index 4024fef..7029221 100644 --- a/backend/app/routers/convert_router.py +++ b/backend/app/routers/convert_router.py @@ -1,4 +1,37 @@ from app.config import logger +from app.convert.convert_bluesky_car import convert_bluesky_car +from app.convert.convert_export_txt import convert_export_txt +from app.convert.convert_facebook_comments_json import ( + convert_facebook_comments_json, +) +from app.convert.convert_facebook_posts_json import convert_facebook_posts_json +from app.convert.convert_instagram_comments_json import ( + convert_instagram_comments_json, +) +from app.convert.convert_instagram_posts_json import ( + convert_instagram_posts_json, +) +from app.convert.convert_instagram_reels_json import ( + convert_instagram_reels_json, +) +from app.convert.convert_instagram_reels_video import ( + convert_instagram_reels_video, +) +from app.convert.convert_instagram_stories_image import ( + convert_instagram_stories_image, +) +from app.convert.convert_instagram_stories_json import ( + convert_instagram_stories_json, +) +from app.convert.convert_linkedin_comments_csv import ( + convert_linkedin_comments_csv, +) +from app.convert.convert_linkedin_shares_csv import convert_linkedin_shares_csv +from app.convert.convert_markdown_txt import convert_markdown_txt +from app.convert.convert_youtube_shorts_video import ( + convert_youtube_shorts_video, +) +from app.convert.convert_youtube_video_video import convert_youtube_video_video from app.models import ConversionRequest, ConversionResponse from fastapi import APIRouter @@ -10,9 +43,44 @@ def convert_data(request: ConversionRequest): """ Convert data from a source to normalized JSON """ - logger.info(f"Converting {request.source_type} data to normalized JSON") - # Example conversion logic (replace with actual implementation) - converted_data = ... + converted_data = None + logger.info(f"Converting {request.source_name} data to normalized JSON") + + if request.source_name == "linkedin_shares": + converted_data = convert_linkedin_shares_csv(request.file) + elif request.source_name == "linkedin_comments": + converted_data = convert_linkedin_comments_csv(request.file) + elif request.source_name == "facebook_posts": + converted_data = convert_facebook_posts_json(request.file) + elif request.source_name == "facebook_comments": + converted_data = convert_facebook_comments_json(request.file) + elif request.source_name == "instagram_posts": + converted_data = convert_instagram_posts_json(request.file) + elif request.source_name == "instagram_comments": + converted_data = convert_instagram_comments_json(request.file) + elif request.source_name == "instagram_stories": + if request.source_format == "json": + converted_data = convert_instagram_stories_json(request.file) + elif request.source_format == "image": + converted_data = convert_instagram_stories_image(request.file) + elif request.source_name == "instagram_reels": + if request.source_format == "json": + converted_data = convert_instagram_reels_json(request.file) + elif request.source_format == "video": + converted_data = convert_instagram_reels_video(request.file) + elif request.source_name == "bluesky": + converted_data = convert_bluesky_car(request.file) + elif request.source_name == "youtube_video": + converted_data = convert_youtube_video_video(request.file) + elif request.source_name == "youtube_shorts": + converted_data = convert_youtube_shorts_video(request.file) + elif request.source_name == "markdown": + converted_data = convert_markdown_txt(request.file) + elif request.source_name == "export": + converted_data = convert_export_txt(request.file) + else: + value_error_message = f"Unsupported source name: {request.source_name}" + raise ValueError(value_error_message) return { "converted_data": converted_data,