🚀 Add feature: Separate conversion functions

This commit is contained in:
François Pelletier 2025-05-14 02:04:13 -04:00
parent 0f1a07da49
commit afdfe1dbac
19 changed files with 318 additions and 17 deletions

View file

@ -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"
),
],
)

View file

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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")

View file

@ -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]

View file

@ -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,