1010from ..storage .storage import *
1111from .seat_analysis import format_seats
1212from .tasks .periodic import run_periodic_task
13+ import traceback
1314
1415class Reese84TokenUpdating ():
1516 def __init__ (self ):
1617 self .is_running = False
17- self .reese84_token = ''
18+ self ._reese84_token = ''
1819 self .reese84_renewInSec = 0
20+ self .token_access_semaphore = Semaphore (1 ) # one can access at a time
1921 self .token_semaphore = Semaphore (0 )
2022 self .scheduler = sched .scheduler (time .time , time .sleep )
2123
24+ @property
25+ def reese84_token (self ):
26+ self .token_semaphore .acquire ()
27+ self .token_access_semaphore .acquire ()
28+ token = self ._reese84_token
29+ self .token_semaphore .release ()
30+ self .token_access_semaphore .release ()
31+
32+ return token
33+
2234 def initialize_reese84_token (self ):
2335 """
2436 This method should not be called directly.
2537 """
26- self .reese84_token , self .reese84_renewInSec = getReese84Token ()
27- self .token_semaphore .release () # produce a new token
38+ self .token_access_semaphore .acquire ()
39+ self ._reese84_token , self .reese84_renewInSec = getReese84Token ()
40+ self .token_semaphore .release () # produce a new token
41+ self .token_access_semaphore .release ()
2842 self .scheduler .enter (self .reese84_renewInSec -
2943 constants .TOKEN_RENEW_SEC_OFFSET , constants .TOKEN_RENEW_PRIORITY , self .renew_reese84_token )
3044
@@ -34,8 +48,10 @@ def renew_reese84_token(self):
3448 """
3549 print ("renewing token" )
3650 self .token_semaphore .acquire () # invalidate a token
37- self .reese84_token = getReese84Token ()
38- self .token_semaphore .release ()
51+ self .token_access_semaphore .acquire ()
52+ self ._reese84_token , self .reese84_renewInSec = getReese84Token ()
53+ self .token_semaphore .release () # produce a token
54+ self .token_access_semaphore .release ()
3955 self .scheduler .enter (self .reese84_renewInSec -
4056 constants .TOKEN_RENEW_SEC_OFFSET , constants .TOKEN_RENEW_PRIORITY , self .renew_reese84_token )
4157
@@ -49,7 +65,7 @@ def start(self):
4965
5066
5167class TicketScraping (threading .Thread ):
52- def __init__ (self , token_generator : Reese84TokenUpdating , event_id : str , subscribe_id : str , num_seats : int , target_price : int , tolerance : int ):
68+ def __init__ (self , token_generator : Reese84TokenUpdating , event_id : str , subscribe_id : str , num_seats : int , target_price : int , tolerance : int , emails : list [ str ] ):
5369 threading .Thread .__init__ (self )
5470 self .is_running = False
5571 self .is_stopping = False
@@ -58,6 +74,7 @@ def __init__(self, token_generator: Reese84TokenUpdating, event_id: str, subscri
5874 self .num_seats = num_seats
5975 self .target_price = target_price
6076 self .tolerance = tolerance
77+ self .emails = emails
6178 self .token_gen = token_generator
6279 self .scheduler = sched .scheduler (time .time , time .sleep )
6380 self .initialDelay = random .randint (
@@ -77,25 +94,26 @@ def flag_for_termination(self):
7794 print (f'Failed to terminate the thread with id={ thread_id } ' )
7895
7996 def ticket_scraping (self ):
80- if self .token_gen .token_semaphore ._value <= 0 :
81- # phase: retry after a delay
82- self .scheduler .enter (constants .TICKET_SCRAPING_TOKEN_AWAIT_MAX_INTERVAL ,
83- constants .TICKET_SCRAPING_PRIORITY , self .ticket_scraping )
84- return
8597 # scrape the top-picks from ticketmaster
8698 top_picks_url = constants .get_top_picks_url (self .event_id )
8799 top_picks_q_params = constants .get_top_picks_query_params (
88100 self .num_seats , self .target_price , self .tolerance )
89101 top_picks_header = constants .get_top_picks_header ()
90- res = requests .get (top_picks_url , headers = top_picks_header , params = top_picks_q_params ,
91- cookies = dict (reese84 = self .token_gen .reese84_token )) # type: ignore
92-
102+ res = None
103+ try :
104+ res = requests .get (top_picks_url , headers = top_picks_header , params = top_picks_q_params ,
105+ cookies = dict (reese84 = self .token_gen .reese84_token )) # type: ignore
106+ except Exception :
107+ # retry after a delay
108+ self .scheduler .enter (constants .TICKET_SCRAPING_TOKEN_AWAIT_MAX_INTERVAL ,
109+ constants .TICKET_SCRAPING_PRIORITY , self .ticket_scraping )
110+ return
93111 # prune and format the received picks
94112 picks_obj = format_seats (res .json (), self .subscribe_id )
95113
96114 # periodic task: update collections best_available_seats and best_history_seats
97115 # and automatically spawn async tasks
98- run_periodic_task (picks_obj , self .subscribe_id , self .target_price )
116+ run_periodic_task (picks_obj , self .subscribe_id , self .target_price , self . emails )
99117
100118 print ("Got the ticket info from TM. /" , res .status_code )
101119 self .scheduler .enter (constants .TICKET_SCRAPING_INTERVAL ,
@@ -116,9 +134,9 @@ def run(self):
116134 return
117135 self .is_running = True
118136 self .is_stopping = False
119- self .ticket_scraping ()
120137 # randomize start time to scatter out event of API fetching
121138 time .sleep (self .initialDelay )
139+ self .ticket_scraping ()
122140 self .scheduler .run ()
123141 finally :
124142 print (
@@ -137,7 +155,7 @@ def start():
137155 '$or' : [{'markPaused' : {'$exists' : False }}, {'markPaused' : False }]})
138156 for evt in events :
139157 ticket_scraping = TicketScraping (
140- reese_token_gen , evt ["tm_event_id" ], evt ["_id" ], evt ["ticket_num" ], evt ["target_price" ], evt ["tolerance" ])
158+ reese_token_gen , evt ["tm_event_id" ], evt ["_id" ], evt ["ticket_num" ], evt ["target_price" ], evt ["tolerance" ], evt [ "client_emails" ] )
141159 print (ticket_scraping .initialDelay , "s" )
142160 scraping_list [ticket_scraping .subscribe_id ] = ticket_scraping
143161 for scraping_thread in scraping_list .values ():
@@ -158,7 +176,7 @@ def start():
158176 # spawn a thread to do scraping operations
159177 full_doc = change ['fullDocument' ]
160178 ticket_scraping = TicketScraping (
161- reese_token_gen , full_doc ["tm_event_id" ], full_doc ["_id" ], full_doc ["ticket_num" ], full_doc ["target_price" ], full_doc ["tolerance" ])
179+ reese_token_gen , full_doc ["tm_event_id" ], full_doc ["_id" ], full_doc ["ticket_num" ], full_doc ["target_price" ], full_doc ["tolerance" ], full_doc [ "client_emails" ] )
162180 print (ticket_scraping .initialDelay , "s" )
163181 scraping_list [ticket_scraping .subscribe_id ] = ticket_scraping
164182 ticket_scraping .start ()
@@ -179,7 +197,7 @@ def start():
179197 # resume scraping if currently paused
180198 if doc_id not in scraping_list :
181199 ticket_scraping = TicketScraping (
182- reese_token_gen , full_doc ["tm_event_id" ], full_doc ["_id" ], full_doc ["ticket_num" ], full_doc ["target_price" ], full_doc ["tolerance" ])
200+ reese_token_gen , full_doc ["tm_event_id" ], full_doc ["_id" ], full_doc ["ticket_num" ], full_doc ["target_price" ], full_doc ["tolerance" ], full_doc [ "client_emails" ] )
183201 print (ticket_scraping .initialDelay , "s" )
184202 scraping_list [ticket_scraping .subscribe_id ] = ticket_scraping
185203 ticket_scraping .start ()
0 commit comments