Files
thread-ripper/thread_ripper/models.py
T

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