151 lines
5.2 KiB
Python
151 lines
5.2 KiB
Python
from typing import Dict, List, Any, Optional
|
|
import logging
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
# Add parent directory to path to import existing tools
|
|
parent_dir = str(Path(__file__).parent.parent.parent.parent)
|
|
if parent_dir not in sys.path:
|
|
sys.path.append(parent_dir)
|
|
|
|
from lib.database.models import ContentType, ContentItem, Platform
|
|
from lib.ai_seo_tools.content_calendar.utils.error_handling import handle_calendar_error
|
|
from lib.gpt_providers.text_generation.main_text_generation import llm_text_gen
|
|
from lib.ai_seo_tools.content_gap_analysis.main import ContentGapAnalysis
|
|
from lib.ai_seo_tools.content_title_generator import ai_title_generator
|
|
from lib.ai_seo_tools.meta_desc_generator import metadesc_generator_main
|
|
from .ai_generator import AIGenerator
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class ContentBriefGenerator:
|
|
"""
|
|
Generates comprehensive content briefs using AI-powered analysis.
|
|
"""
|
|
|
|
def __init__(self):
|
|
self.logger = logging.getLogger('content_calendar.content_brief')
|
|
self.logger.info("Initializing ContentBriefGenerator")
|
|
self._setup_logging()
|
|
self._load_ai_tools()
|
|
|
|
def _setup_logging(self):
|
|
"""Configure logging for content brief generator."""
|
|
logger.setLevel(logging.INFO)
|
|
handler = logging.StreamHandler()
|
|
formatter = logging.Formatter(
|
|
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
handler.setFormatter(formatter)
|
|
logger.addHandler(handler)
|
|
|
|
def _load_ai_tools(self):
|
|
"""Load and initialize AI tools."""
|
|
try:
|
|
# Initialize AI tools
|
|
self.gap_analyzer = ContentGapAnalysis()
|
|
self.title_generator = ai_title_generator
|
|
self.meta_generator = metadesc_generator_main
|
|
self.ai_generator = AIGenerator()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error loading AI tools: {str(e)}")
|
|
raise
|
|
|
|
@handle_calendar_error
|
|
def generate_brief(
|
|
self,
|
|
content_item: ContentItem,
|
|
target_audience: Optional[Dict[str, Any]] = None
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Generate a comprehensive content brief.
|
|
|
|
Args:
|
|
content_item: Content item to generate brief for
|
|
target_audience: Optional target audience data
|
|
|
|
Returns:
|
|
Dictionary containing the content brief
|
|
"""
|
|
try:
|
|
logger.info(f"Generating content brief for: {content_item.title}")
|
|
|
|
# Generate content outline
|
|
outline = self._generate_outline(content_item)
|
|
|
|
# Generate key points
|
|
key_points = self.ai_generator.generate_key_points(
|
|
title=content_item.title,
|
|
content_type=content_item.content_type,
|
|
context=content_item.context
|
|
)
|
|
|
|
# Generate content flow
|
|
content_flow = self.ai_generator.generate_content_flow(
|
|
title=content_item.title,
|
|
content_type=content_item.content_type,
|
|
outline=outline
|
|
)
|
|
|
|
# Compile the brief
|
|
brief = {
|
|
'title': content_item.title,
|
|
'content_type': content_item.content_type.value,
|
|
'outline': outline,
|
|
'key_points': key_points,
|
|
'content_flow': content_flow,
|
|
'target_audience': target_audience or {},
|
|
'seo_data': content_item.seo_data,
|
|
'platform_specs': content_item.platform_specs
|
|
}
|
|
|
|
logger.info("Content brief generated successfully")
|
|
return brief
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error generating content brief: {str(e)}")
|
|
raise
|
|
|
|
def _generate_outline(
|
|
self,
|
|
content_item: ContentItem
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Generate content outline with headings and subheadings.
|
|
|
|
Args:
|
|
content_item: Content item to generate outline for
|
|
|
|
Returns:
|
|
Dictionary containing the content outline
|
|
"""
|
|
try:
|
|
# Generate main headings
|
|
main_headings = self.ai_generator.generate_headings(
|
|
title=content_item.title,
|
|
content_type=content_item.content_type,
|
|
context=content_item.context
|
|
)
|
|
|
|
# Generate subheadings for each main heading
|
|
subheadings = {}
|
|
for heading in main_headings:
|
|
heading_subheadings = self.ai_generator.generate_subheadings(
|
|
main_heading=heading,
|
|
content_type=content_item.content_type,
|
|
context=content_item.context
|
|
)
|
|
subheadings[heading['title']] = heading_subheadings
|
|
|
|
return {
|
|
'main_headings': main_headings,
|
|
'subheadings': subheadings
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error generating outline: {str(e)}")
|
|
return {
|
|
'main_headings': [],
|
|
'subheadings': {}
|
|
} |