Add files via upload
This commit is contained in:
156
ios.py
156
ios.py
@@ -0,0 +1,156 @@
|
|||||||
|
import ui
|
||||||
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
import re
|
||||||
|
|
||||||
|
REFRESH_INTERVAL = 300 # seconds (5 minutes)
|
||||||
|
|
||||||
|
class NHSMonitorApp:
|
||||||
|
def __init__(self):
|
||||||
|
self.refresh_timer = None
|
||||||
|
|
||||||
|
# Create main view
|
||||||
|
self.main_view = ui.View()
|
||||||
|
self.main_view.name = "🩺 NHS A&E & UTC Waiting Times"
|
||||||
|
self.main_view.background_color = '#f7f9fc'
|
||||||
|
|
||||||
|
# Create labels
|
||||||
|
self.title_label = ui.Label()
|
||||||
|
self.title_label.text = "NHS North Cumbria Waiting Times"
|
||||||
|
self.title_label.font = ('Segoe UI', 18, 'bold')
|
||||||
|
self.title_label.text_color = '#222'
|
||||||
|
self.title_label.frame = (20, 20, self.main_view.width - 40, 40)
|
||||||
|
self.main_view.add_subview(self.title_label)
|
||||||
|
|
||||||
|
self.countdown_label = ui.Label()
|
||||||
|
self.countdown_label.font = ('Segoe UI', 11)
|
||||||
|
self.countdown_label.text_color = '#666'
|
||||||
|
self.countdown_label.frame = (20, 70, self.main_view.width - 40, 30)
|
||||||
|
self.main_view.add_subview(self.countdown_label)
|
||||||
|
|
||||||
|
# Create text views for A&E and UTC
|
||||||
|
self.left_text = ui.TextView()
|
||||||
|
self.left_text.font = ('Segoe UI', 12)
|
||||||
|
self.left_text.background_color = 'white'
|
||||||
|
self.left_text.text_color = '#222222'
|
||||||
|
self.left_text.editable = False
|
||||||
|
self.left_text.frame = (20, 110, self.main_view.width / 2 - 30, self.main_view.height - 150)
|
||||||
|
self.main_view.add_subview(self.left_text)
|
||||||
|
|
||||||
|
self.right_text = ui.TextView()
|
||||||
|
self.right_text.font = ('Segoe UI', 12)
|
||||||
|
self.right_text.background_color = 'white'
|
||||||
|
self.right_text.text_color = '#222222'
|
||||||
|
self.right_text.editable = False
|
||||||
|
self.right_text.frame = (self.main_view.width / 2 + 10, 110, self.main_view.width / 2 - 30, self.main_view.height - 150)
|
||||||
|
self.main_view.add_subview(self.right_text)
|
||||||
|
|
||||||
|
# Start the app
|
||||||
|
self.refresh_data()
|
||||||
|
self.start_auto_refresh()
|
||||||
|
|
||||||
|
def simplify_name(self, full_name):
|
||||||
|
name = re.sub(r"(,.*)?\s*24hrs", "", full_name, flags=re.IGNORECASE).strip()
|
||||||
|
|
||||||
|
if "Penrith Community Hospital" in name:
|
||||||
|
name = "Penrith Community Hospital"
|
||||||
|
elif "Keswick Community Hospital" in name:
|
||||||
|
name = "Keswick Community Hospital"
|
||||||
|
|
||||||
|
return name
|
||||||
|
|
||||||
|
def fetch_data(self):
|
||||||
|
url = "https://www.ncic.nhs.uk/waiting/ncic-live-emergencytimes.html"
|
||||||
|
try:
|
||||||
|
response = requests.get(url)
|
||||||
|
response.raise_for_status()
|
||||||
|
soup = BeautifulSoup(response.text, "html.parser")
|
||||||
|
|
||||||
|
tables = soup.find_all("tbody")
|
||||||
|
if not tables or len(tables) < 2:
|
||||||
|
return None, "⚠️ Could not find A&E and UTC tables on the page."
|
||||||
|
|
||||||
|
results = {"A&E Departments": [], "Urgent Treatment Centres": []}
|
||||||
|
labels = list(results.keys())
|
||||||
|
|
||||||
|
for idx, table in enumerate(tables[:2]):
|
||||||
|
rows = table.find_all("tr")
|
||||||
|
|
||||||
|
for i, row in enumerate(rows):
|
||||||
|
cols = row.find_all("td")
|
||||||
|
if len(cols) < 4:
|
||||||
|
continue
|
||||||
|
|
||||||
|
department = cols[0].get_text(separator=" ", strip=True)
|
||||||
|
simplified_name = self.simplify_name(department)
|
||||||
|
|
||||||
|
patients = cols[1].get_text(strip=True)
|
||||||
|
wait_time = cols[2].get_text(strip=True)
|
||||||
|
arrivals = cols[3].get_text(strip=True)
|
||||||
|
|
||||||
|
entry_lines = []
|
||||||
|
|
||||||
|
# Add blank lines for spacing
|
||||||
|
if simplified_name == "West Cumberland Hospital":
|
||||||
|
entry_lines.append("\n")
|
||||||
|
if simplified_name == "Keswick Community Hospital":
|
||||||
|
entry_lines.append("\n")
|
||||||
|
|
||||||
|
# Prepare hospital name line (with icon)
|
||||||
|
hospital_line = f"🏥 {simplified_name}"
|
||||||
|
entry_lines.append(hospital_line)
|
||||||
|
entry_lines.append(f" • Patients in department: {patients}")
|
||||||
|
entry_lines.append(f" • Average wait: {wait_time}")
|
||||||
|
entry_lines.append(f" • Arrivals last hour: {arrivals}")
|
||||||
|
|
||||||
|
results[labels[idx]].append((entry_lines, simplified_name))
|
||||||
|
|
||||||
|
return results, None
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return None, f"❌ Error fetching data: {e}"
|
||||||
|
|
||||||
|
def refresh_data(self):
|
||||||
|
for text_widget in [self.left_text, self.right_text]:
|
||||||
|
text_widget.text = "🔄 Fetching latest data...\n\n"
|
||||||
|
|
||||||
|
results, error = self.fetch_data()
|
||||||
|
|
||||||
|
if error:
|
||||||
|
self.left_text.text = error
|
||||||
|
self.right_text.text = error
|
||||||
|
else:
|
||||||
|
# Insert A&E Departments
|
||||||
|
self.left_text.text = "A&E Departments\n\n"
|
||||||
|
for entry, hosp_name in results["A&E Departments"]:
|
||||||
|
for line in entry:
|
||||||
|
self.left_text.text += line + "\n"
|
||||||
|
self.left_text.text += "\n"
|
||||||
|
|
||||||
|
# Insert UTC
|
||||||
|
self.right_text.text = "Urgent Treatment Centres\n\n"
|
||||||
|
for entry, hosp_name in results["Urgent Treatment Centres"]:
|
||||||
|
for line in entry:
|
||||||
|
self.right_text.text += line + "\n"
|
||||||
|
self.right_text.text += "\n"
|
||||||
|
|
||||||
|
def countdown_and_refresh(self):
|
||||||
|
for remaining in range(REFRESH_INTERVAL, 0, -1):
|
||||||
|
mins, secs = divmod(remaining, 60)
|
||||||
|
self.countdown_label.text = f"⏳ Next refresh in: {mins:02d}:{secs:02d}"
|
||||||
|
time.sleep(1)
|
||||||
|
self.refresh_data()
|
||||||
|
self.start_auto_refresh()
|
||||||
|
|
||||||
|
def start_auto_refresh(self):
|
||||||
|
if self.refresh_timer:
|
||||||
|
self.refresh_timer.cancel()
|
||||||
|
self.refresh_timer = threading.Timer(REFRESH_INTERVAL, self.countdown_and_refresh)
|
||||||
|
self.refresh_timer.start()
|
||||||
|
|
||||||
|
# Start the app
|
||||||
|
app = NHSMonitorApp()
|
||||||
|
app.main_view.present('sheet')
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user