
    Wi%                     ~   d Z ddlZddlZddlZddlZddlmZmZmZ dZd Z	d Z
ddd	d
ddddddddddZd ZddZedk(  rx ej                  d      Zej#                  dedd       ej'                         Zej*                  j-                  d      D  cg c]  } | j/                          c} Z ee       yyc c} w ) z
Capture Live/In-Game Odds from The Odds API

Polls The Odds API for live games and captures in-play odds.
Falls back when SGO is unavailable.

Run: Every 5 minutes during game hours
    N)datetimetimezone	timedeltazhttps://api.the-odds-api.com/v4c                     d} 	 t        | d      5 }|D ]b  }|j                  d      s|j                  dd      d   j                         j                  d      j                  d      d   c cd d d        S  	 d d d        t
        j                  j                  d	d
      j                  d      d   S # 1 sw Y   ;xY w# t        $ r Y Iw xY w)N/var/www/html/eventheodds/.envrzSPORTS_DATABASE_URL==   "?r   SPORTS_DATABASE_URL open
startswithsplitstripFileNotFoundErrorosenvirongetenv_pathflines      'scripts/capture_live_odds_theoddsapi.pyload_db_urlr      s    /H(C  	RA R??#9:::c1-a0668>>sCII#NqQQ	R 	RR	R ::>>/4::3?BB	R 	R  s:   B? B3AB3-	B? 7B39B? 3B<8B? ?	C
Cc                  4   d} 	 t        | d      5 }|D ]A  }|j                  d      s|j                  dd      d   j                         c cd d d        S  	 d d d        t
        j                  j                  d      S # 1 sw Y   (xY w# t        $ r Y 6w xY w)Nr   r   zTHE_ODDS_API_KEY=r	   r
   THE_ODDS_API_KEYr   r   s      r   load_odds_api_keyr       s    /H(C  	9A 9??#67::c1-a06688	9 	99	9 ::>>,--	9 	9  s9   B A?$A?	B A?B ?BB 	BBbasketball_nbaamericanfootball_nflicehockey_nhlbaseball_mlbbasketball_ncaabamericanfootball_ncaafbasketball_wnba
soccer_eplsoccer_germany_bundesligasoccer_italy_serie_asoccer_spain_la_ligasoccer_france_ligue_onesoccer_usa_mls)nbanflnhlmlbncaabncaafwnbaepl
bundesligaseriealaligaligue1mlsc                    t         j                  |      }|sg S | ddddd}	 t        j                  t         d| d|d	      }|j                  d
k(  rt        d|        g S |j                  dk(  rt        d|        g S |j                  dk7  rt        d|j                   d|        g S |j                         }t        j                  t        j                        }g }|D ]h  }|j                  d      }	|	s	 t        j                  |	j                  dd            }
|t        d      z
  |
cxk  r|k  rn n|j                  |       j ||fS #  Y sxY w# t        $ r}t        d| d|        g g fcY d}~S d}~ww xY w)zGet live odds from The Odds APIuszspreads,totals,h2hamericanr   )apiKeyregionsmarkets
oddsFormateventIdsz/sports/z/odds   )paramstimeouti  z  Invalid API key for i  z  No events for    z  API returned z for commence_timeZ+00:00   )hoursz  Error fetching : N)
LEAGUE_MAPr   requestsODDS_API_BASEstatus_codeprintjsonr   nowr   utcfromisoformatreplacer   append	Exception)api_keyleaguesportrD   respeventsrS   live_eventseventcommencecommence_dtes               r   get_live_oddsrc   =   s   NN6"E	 ' F'||oXeWE2
 s"*6(34Is"$VH-.Is"OD$4$4#5U6(CDI ll8<<( 		Eyy1H"*"8"89I9I#x9X"YKYQ//+CC#**51		 F""  !&A3/02vsJ   A E $E +E /AE >AEE EE 	F%E?9F?Fc                    | g d} t        d       t        d       t        dt        j                  t        j                        j                                 t        ddj                  |               t        d       t               }t               }|st        d       y t        j                  |      }|j                         }|j                  d       |j                  d	       |j                          d
}d
}| D ]  }t        ||      }|s|\  }	}
t        d|j                          dt!        |	       dt!        |
       d       |t!        |	      z  }|
D ]W  }|j#                  d      }|j#                  dd      }|j#                  dd      }|j#                  d      }d }|r&	 t        j$                  |j'                  dd            }|j#                  dg       }|d d D ]  }|j#                  dd      }d x}}d x}}d }d x}}d x}}|j#                  dg       D ]f  }|j#                  d      }|j#                  dg       }|dk(  rv|D ]p  } | j#                  d      |k(  r#| j#                  d      }| j#                  d      }:| j#                  d      |k(  sO| j#                  d      }| j#                  d      }r |d k(  rf|D ]_  } | j#                  d      d!k(  r#| j#                  d      }| j#                  d      }:| j#                  d      d"k(  sO| j#                  d      }a |d#k(  s|D ]N  } | j#                  d      |k(  r| j#                  d      })| j#                  d      |k(  s>| j#                  d      }P i |j                  d$|||||||||||||||f       |d%z  } Z  |j                          t        dd        t        d&| d'| d(       |j                  d)       t        d*       |j)                         D ]  }!t        d+|!d
    d|!d%            t        d       |j+                          |j+                          y #  Y xY w),N)r.   r/   r0   r1   r2   r3   z<============================================================z CAPTURE LIVE ODDS (The Odds API)zTime: z	Leagues: z, zERROR: THE_ODDS_API_KEY not seta  
        CREATE TABLE IF NOT EXISTS "LiveOdds" (
            id SERIAL PRIMARY KEY,
            league VARCHAR(20),
            "gameId" INTEGER,
            "externalGameId" VARCHAR(100),
            "gameDate" TIMESTAMP,
            "homeTeam" VARCHAR(100),
            "awayTeam" VARCHAR(100),
            "gameStatus" VARCHAR(20),
            "gameTime" VARCHAR(20),
            "homeScoreLive" INTEGER,
            "awayScoreLive" INTEGER,
            "liveSpreadHome" DOUBLE PRECISION,
            "liveSpreadAway" DOUBLE PRECISION,
            "liveSpreadHomeOdds" INTEGER,
            "liveSpreadAwayOdds" INTEGER,
            "liveTotal" DOUBLE PRECISION,
            "liveTotalOverOdds" INTEGER,
            "liveTotalUnderOdds" INTEGER,
            "liveMoneylineHome" INTEGER,
            "liveMoneylineAway" INTEGER,
            "capturedAt" TIMESTAMP DEFAULT NOW(),
            source VARCHAR(50),
            bookmaker VARCHAR(50),
            raw JSONB,
            "createdAt" TIMESTAMP DEFAULT NOW()
        )
    zy
        CREATE INDEX IF NOT EXISTS idx_live_odds_game
        ON "LiveOdds"(league, "externalGameId", "capturedAt")
    r   
rL   z live, z total eventsid	home_teamr   	away_teamrG   rH   rI   
bookmakers   keyunknownr@   outcomesspreadsnamepointpricetotalsOverUnderh2haI  
                    INSERT INTO "LiveOdds" (
                        league, "externalGameId", "gameDate", "homeTeam", "awayTeam",
                        "liveSpreadHome", "liveSpreadAway", "liveSpreadHomeOdds", "liveSpreadAwayOdds",
                        "liveTotal", "liveTotalOverOdds", "liveTotalUnderOdds",
                        "liveMoneylineHome", "liveMoneylineAway",
                        "capturedAt", source, bookmaker
                    )
                    VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), 'theoddsapi', %s)
                r
   z	RESULTS: z live games, z odds capturedz
        SELECT league, COUNT(*)
        FROM "LiveOdds"
        WHERE "capturedAt" > NOW() - INTERVAL '1 hour'
        GROUP BY league
    z
Recent captures by league:z  )rQ   r   rS   r   rT   	isoformatjoinr   r    psycopg2connectcursorexecutecommitrc   upperlenr   rU   rV   fetchallclose)"leaguesdb_urlrY   conncurtotal_captured
total_liverZ   resultr^   
all_eventsr_   event_idhomeawayr`   ra   ri   book	book_namespread_homespread_awayspread_home_oddsspread_away_odds
total_linetotal_over_oddstotal_under_oddsml_homeml_awaymarket
market_keyrm   outcomerows"                                     r   capture_oddsr   u   s   @	(O	
,-	F8<<-779:
;<	Idii()
*+	(O]F!G/0F#D
++-C KK  	: KK  	 	KKMNJ N$w/"(Z6<<>""S%5$6gc*o=Nm\]c+&&
   D	$EyyH99["-D99["-Dyy1HK"*"8"89I9I#x9X"YK
 <4J"2A 5$ HHUI6	,00k6:: #3!
599"2$(('"hhy"5 ?F!'E!2J%zz*b9H!Y.'/ HG&{{62d:.5kk'.B3:;;w3G 0!(V!4!<.5kk'.B3:;;w3G 0H $x/'/ HG&{{62f<-4[[-A
29++g2F!(V!4!?3:;;w3G 0H $u,'/ ?G&{{62d:*1++g*>!(V!4!<*1++g*>	?-?:  	 Hk4.>@P1AWi	 !#k5$D	$N$` 	KKM 
Bvh-	Ij\~.>n
MNKK  	 

()||~ '3q6("SVH%&' 
(OIIKJJL_s   -%Q  Q%__main__z#Capture Live Odds from The Odds API)descriptionz	--leaguesznba,nfl,nhl,mlb,ncaab,ncaafz>Comma-separated leagues (default: nba,nfl,nhl,mlb,ncaab,ncaaf))typedefaulthelp,)N)__doc__argparserN   rx   r   r   r   r   rO   r   r    rM   rc   r   __name__ArgumentParserparseradd_argumentstr
parse_argsargsr   r   r   )ls   0r   <module>r      s       	 2 21	C	. !%-$$'
"5p^B z$X$$1VWF
#7T]  _D"&,,"4"4S"9:Qqwwy:G 
 ;s   B: