diff --git a/deathclock/__pycache__/news.cpython-311.pyc b/deathclock/__pycache__/news.cpython-311.pyc index bb5b2ce..0077304 100644 Binary files a/deathclock/__pycache__/news.cpython-311.pyc and b/deathclock/__pycache__/news.cpython-311.pyc differ diff --git a/deathclock/__pycache__/scores.cpython-311.pyc b/deathclock/__pycache__/scores.cpython-311.pyc index fd701f0..581d118 100644 Binary files a/deathclock/__pycache__/scores.cpython-311.pyc and b/deathclock/__pycache__/scores.cpython-311.pyc differ diff --git a/deathclock/__pycache__/weather.cpython-311.pyc b/deathclock/__pycache__/weather.cpython-311.pyc index 8a03d24..0f9a61b 100644 Binary files a/deathclock/__pycache__/weather.cpython-311.pyc and b/deathclock/__pycache__/weather.cpython-311.pyc differ diff --git a/deathclock/app.py b/deathclock/app.py index 91cb3cf..e180b3b 100644 --- a/deathclock/app.py +++ b/deathclock/app.py @@ -19,14 +19,14 @@ def create_app(): html.H2("NBA Scores"), html.Div(id='nba-scores-display', className='score-container') ]), - html.Div(id='weather-display') - ], id='scores-weather-container'), + html.Div(id='weather-display', style={"display": "flex", "justify-content": "center", "margin-bottom":"20px"}) + ], id='scores-weather-container', style={"display": "flex", "gap": "20px"}), ]), html.Div(id='news-ticker'), dcc.Interval(id='clock-interval', interval=60000, n_intervals=0), - dcc.Interval(id='weather-interval', interval=150000, n_intervals=0), + dcc.Interval(id='weather-interval', interval=550000, n_intervals=0), dcc.Interval(id='news-interval', interval=300000, n_intervals=0), dcc.Interval(id='nba-interval', interval=300000, n_intervals=0) ]) diff --git a/deathclock/weather.py b/deathclock/weather.py index 3cb4f09..217976c 100644 --- a/deathclock/weather.py +++ b/deathclock/weather.py @@ -1,30 +1,55 @@ -from playwright.sync_api import sync_playwright import os +import subprocess +import datetime class Weather: def __init__(self): - if not os.path.exists('assets'): - os.makedirs('assets') - + # Get the directory where this script (weather.py) is located + self.script_dir = os.path.dirname(os.path.abspath(__file__)) + + # Construct the absolute path to the 'assets' directory in the same directory as the script + self.assets_dir = os.path.join(self.script_dir, 'assets') + + # Ensure the assets directory exists + if not os.path.exists(self.assets_dir): + os.makedirs(self.assets_dir) + + def delete_old_screenshots(self): + """ + Deletes all PNG files in the 'assets' directory that start with 'sacramento_weather_'. + """ + for filename in os.listdir(self.assets_dir): + if filename.startswith("sacramento_weather_"): + os.remove(os.path.join(self.assets_dir, filename)) + def get_weather_screenshot(self): - with sync_playwright() as p: - browser = p.chromium.launch(headless=True) - context = browser.new_context() - context.add_init_script(""" - Object.defineProperty(navigator, 'webdriver', { - get: () => undefined, - }); - """) - page = context.new_page() - - # Navigate to Sacramento weather - page.goto("https://www.bing.com/search?q=sacramento+weather&qs=n&form=QBRE&sp=-1&ghc=1&lq=0&pq=sacramento+weathe&sc=12-17&sk=&cvid=9D84287D34AC483C85F6E3AA7F943C4F&ghsh=0&ghacc=0&ghpl=") - - # Wait for and screenshot weather widget - page.wait_for_selector('#wtr_cardContainer > div.b_antiTopBleed.b_antiSideBleed.b_antiBottomBleed.b_weainner') - weather_element = page.locator('#wtr_cardContainer > div.b_antiTopBleed.b_antiSideBleed.b_antiBottomBleed.b_weainner') - screenshot_path = os.path.join('assets', 'sacramento_weather_map.png') - weather_element.screenshot(path=screenshot_path) - - browser.close() + """ + Fetches weather information for Sacramento from wttr.in using curl and saves it as a PNG. + Returns the path to the saved image. + """ + try: + # Create a timestamp for the filename + timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + screenshot_filename = f"sacramento_weather_{timestamp}.png" + screenshot_path = os.path.join(self.assets_dir, screenshot_filename) # save to the proper location + + # Use curl to get the weather data from wttr.in and save it as a PNG. + # add the scale #2 to make the png larger + curl_command = [ + "curl", + "-s", # Silent mode + "wttr.in/Sacramento.png?u", + "-o", + screenshot_path, + ] + self.delete_old_screenshots() + subprocess.run(curl_command, check=True) + return screenshot_path + + except subprocess.CalledProcessError as e: + print(f"Error fetching weather data: {e}") + return None + except Exception as e: + print(f"An unexpected error occurred: {e}") + return None diff --git a/deathclock/weather_module.py b/deathclock/weather_module.py index 9a0f01a..ff732e5 100644 --- a/deathclock/weather_module.py +++ b/deathclock/weather_module.py @@ -10,8 +10,6 @@ class WeatherModule: self.setup_callbacks() def get_weather_object(self): - if not os.path.exists('assets'): - os.makedirs('assets') return Weather() def setup_callbacks(self): @@ -24,11 +22,15 @@ class WeatherModule: print("UPDATING WEATHER...") screenshot_path = self.weather_obj.get_weather_screenshot() image_name = os.path.basename(screenshot_path) - return html.Div([ - html.H2("Sacramento Weather"), - html.Img(src=self.app.get_asset_url(image_name - + f"?v={datetime.datetime.now().timestamp()}"), - style={'maxWidth': '500px'}) - ]) + return html.Div( + [ + html.H2("Sacramento Weather"), + html.Img( + src=self.app.get_asset_url(image_name + f"?v={datetime.datetime.now().timestamp()}"), + style={"width": "100%", "display": "block", "image-rendering": "crisp-edges"} + ), + ], + style={"width": "600px", "margin": "0 auto", "border": "1px solid black"} + ) except Exception as e: return html.Div(f"Weather update error: {str(e)}")