53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
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'
|
|
max_scrolls: int = 6
|
|
|
|
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
|