from typing import List, Optional, Dict, Any from pydantic import BaseModel, Field from datetime import datetime class MediaItem(BaseModel): type: str = "image" url: str alt_text: Optional[str] = None class PostSegment(BaseModel): index: int author_handle: str author_name: Optional[str] = None author_avatar: Optional[str] = None timestamp: Optional[str] = None url: Optional[str] = None text: str is_author: bool = True images: List[MediaItem] = Field(default_factory=list) stats: Dict[str, str] = Field(default_factory=dict) class RippedThread(BaseModel): id: str original_url: str canonical_url: str author_handle: str author_name: str author_avatar: Optional[str] = None created_at: str title: str segments: List[PostSegment] stitched_markdown: str stitched_text: str stitched_html: str segment_count: int total_words: int saved_at: datetime = Field(default_factory=datetime.utcnow) class RipRequest(BaseModel): url: str mode: str = "author_only" # 'author_only' or 'all_replies' include_images: bool = False max_scrolls: int = 4 class HistorySummary(BaseModel): id: str title: str author_handle: str author_name: str segment_count: int total_words: int saved_at: str original_url: str