130 lines
4.2 KiB
Python
130 lines
4.2 KiB
Python
"""Fix switch hitter cards by regenerating with correct handedness and uploading to S3"""
|
|
import os
|
|
import sys
|
|
import asyncio
|
|
import aiohttp
|
|
import boto3
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
# Add parent directory to path for imports
|
|
sys.path.insert(0, '/home/cal/.claude/skills/paper-dynasty')
|
|
from api_client import PaperDynastyAPI
|
|
|
|
# Configuration
|
|
SWITCH_HITTER_IDS = [12785, 12788, 12854, 12735, 12858, 12786, 12852, 12727, 12757, 12831, 12748]
|
|
PLAYER_NAMES = [
|
|
"Bernie Williams", "Brian Roberts", "Carlos Beltran", "Chone Figgins",
|
|
"Jimmy Rollins", "Jorge Posada", "Jose Reyes", "Mark Teixeira",
|
|
"Nick Swisher", "Omar Vizquel", "Victor Martinez"
|
|
]
|
|
CARDSET_ID = 27
|
|
NEW_DATE = "2025-11-12" # Tomorrow's date for cache-busting
|
|
AWS_BUCKET = "paper-dynasty"
|
|
AWS_REGION = "us-east-1"
|
|
|
|
# Initialize API client
|
|
api = PaperDynastyAPI(environment='prod', verbose=True)
|
|
|
|
# Initialize S3 client
|
|
s3_client = boto3.client('s3', region_name=AWS_REGION)
|
|
|
|
|
|
async def fetch_and_save_card(session: aiohttp.ClientSession, player_id: int, player_name: str) -> str:
|
|
"""Fetch card image from API and save locally"""
|
|
card_url = f"https://pd.manticorum.com/api/v2/players/{player_id}/battingcard?d={NEW_DATE}"
|
|
|
|
print(f"Fetching card for {player_name} (ID: {player_id})...")
|
|
print(f" URL: {card_url}")
|
|
|
|
async with session.get(card_url) as response:
|
|
if response.status != 200:
|
|
raise Exception(f"Failed to fetch card: HTTP {response.status}")
|
|
|
|
# Save to temp directory
|
|
temp_dir = Path(f"/tmp/switch_hitter_cards")
|
|
temp_dir.mkdir(exist_ok=True)
|
|
|
|
file_path = temp_dir / f"player-{player_id}-battingcard.png"
|
|
|
|
with open(file_path, 'wb') as f:
|
|
f.write(await response.read())
|
|
|
|
print(f" ✓ Saved to {file_path}")
|
|
return str(file_path)
|
|
|
|
|
|
def upload_to_s3(file_path: str, player_id: int) -> str:
|
|
"""Upload card to S3 and return the URL"""
|
|
s3_key = f"cards/cardset-{CARDSET_ID:03d}/player-{player_id}/battingcard.png"
|
|
|
|
print(f" Uploading to S3: s3://{AWS_BUCKET}/{s3_key}")
|
|
|
|
with open(file_path, 'rb') as f:
|
|
s3_client.put_object(
|
|
Bucket=AWS_BUCKET,
|
|
Key=s3_key,
|
|
Body=f,
|
|
ContentType='image/png',
|
|
CacheControl='public, max-age=31536000' # 1 year cache
|
|
)
|
|
|
|
# Return the S3 URL with cache-busting date
|
|
s3_url = f"https://{AWS_BUCKET}.s3.{AWS_REGION}.amazonaws.com/{s3_key}?d={NEW_DATE}"
|
|
print(f" ✓ Uploaded to S3: {s3_url}")
|
|
|
|
return s3_url
|
|
|
|
|
|
def update_player_image_url(player_id: int, s3_url: str):
|
|
"""Update player record with new S3 image URL"""
|
|
print(f" Updating player {player_id} image URL...")
|
|
|
|
result = api.patch('players', object_id=player_id, params=[('image', s3_url)])
|
|
|
|
print(f" ✓ Updated player record")
|
|
return result
|
|
|
|
|
|
async def main():
|
|
print("=" * 80)
|
|
print("FIXING SWITCH HITTER CARDS")
|
|
print("=" * 80)
|
|
print(f"Players to fix: {len(SWITCH_HITTER_IDS)}")
|
|
print(f"New date: {NEW_DATE}")
|
|
print(f"S3 Bucket: {AWS_BUCKET}")
|
|
print("=" * 80)
|
|
print()
|
|
|
|
async with aiohttp.ClientSession() as session:
|
|
for idx, player_id in enumerate(SWITCH_HITTER_IDS, 1):
|
|
player_name = PLAYER_NAMES[idx - 1]
|
|
|
|
print(f"\n[{idx}/{len(SWITCH_HITTER_IDS)}] Processing {player_name} (ID: {player_id})")
|
|
print("-" * 80)
|
|
|
|
try:
|
|
# Step 1: Fetch card from API (triggers regeneration)
|
|
file_path = await fetch_and_save_card(session, player_id, player_name)
|
|
|
|
# Step 2: Upload to S3
|
|
s3_url = upload_to_s3(file_path, player_id)
|
|
|
|
# Step 3: Update player record
|
|
update_player_image_url(player_id, s3_url)
|
|
|
|
print(f" ✅ COMPLETED: {player_name}")
|
|
|
|
except Exception as e:
|
|
print(f" ❌ ERROR: {e}")
|
|
continue
|
|
|
|
print("\n" + "=" * 80)
|
|
print("ALL SWITCH HITTERS PROCESSED")
|
|
print("=" * 80)
|
|
print(f"\nVerify Bernie Williams: https://paper-dynasty.s3.us-east-1.amazonaws.com/cards/cardset-027/player-12785/battingcard.png?d={NEW_DATE}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|