Spaces:
Sleeping
Sleeping
File size: 3,882 Bytes
4f9adc4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | """
Pydantic models for the source finding module.
Contains data models for representing game search results and metadata.
"""
from typing import Optional
from pydantic import BaseModel, Field
class GameResult(BaseModel):
"""
Represents a single college football game found on nfl-video.com.
Attributes:
title: Full title from the website, e.g. "Ohio State vs Oregon Football 2024 Big Ten Championship Full Game Replay"
team_a: First team name parsed from the title (appears before "vs")
team_b: Second team name parsed from the title (appears after "vs")
url: Full URL to the game's page on nfl-video.com
thumbnail_url: URL to the game's thumbnail image, if available
date_str: Date string parsed from the page, e.g. "January 8, 2024"
event: Event name parsed from the title, e.g. "CFP National Championship", "Big Ten Championship"
year: Year of the game, parsed from the title
"""
title: str = Field(..., description="Full title of the game from the website")
team_a: str = Field(..., description="First team name (before 'vs')")
team_b: str = Field(..., description="Second team name (after 'vs')")
url: str = Field(..., description="Full URL to the game page")
thumbnail_url: Optional[str] = Field(default=None, description="URL to thumbnail image")
date_str: Optional[str] = Field(default=None, description="Date string, e.g. 'January 8, 2024'")
event: Optional[str] = Field(default=None, description="Event name, e.g. 'CFP National Championship'")
year: Optional[int] = Field(default=None, description="Year of the game")
def __str__(self) -> str:
"""Human-readable representation of the game."""
event_str = f" ({self.event})" if self.event else ""
date_str = f" - {self.date_str}" if self.date_str else ""
return f"{self.team_a} vs {self.team_b}{event_str}{date_str}"
def get_filename_base(self) -> str:
"""
Generate a safe filename base for this game (without extension).
Returns:
A filename-safe string like "Ohio_State_vs_Oregon_2024"
"""
# Replace spaces with underscores and remove special characters
# pylint: disable=no-member # False positive: Pydantic fields are strings at runtime
team_a_safe = self.team_a.replace(" ", "_").replace("(", "").replace(")", "")
team_b_safe = self.team_b.replace(" ", "_").replace("(", "").replace(")", "")
year_str = f"_{self.year}" if self.year else ""
return f"{team_a_safe}_vs_{team_b_safe}{year_str}"
class SearchResults(BaseModel):
"""
Results from searching for games on nfl-video.com.
Attributes:
query_team_a: The team name that was searched for (required)
query_team_b: Optional second team name that was searched for
games: List of matching GameResult objects
pages_searched: Number of pages that were searched
total_games_scanned: Total number of games scanned across all pages
"""
query_team_a: str = Field(..., description="Primary team name searched for")
query_team_b: Optional[str] = Field(default=None, description="Optional second team name searched for")
games: list[GameResult] = Field(default_factory=list, description="List of matching games found")
pages_searched: int = Field(default=0, description="Number of pages searched")
total_games_scanned: int = Field(default=0, description="Total games scanned across all pages")
def __str__(self) -> str:
"""Human-readable summary of search results."""
team_str = self.query_team_a
if self.query_team_b:
team_str += f" vs {self.query_team_b}"
return f"Search for '{team_str}': {len(self.games)} games found (scanned {self.total_games_scanned} across {self.pages_searched} pages)"
|