From e216d0328ef0e6e6f758e3376e060a6ed589c5df Mon Sep 17 00:00:00 2001 From: jakub_figat Date: Thu, 24 Jul 2025 12:16:30 +0000 Subject: [PATCH] Add main.py --- main.py | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..a9d7f45 --- /dev/null +++ b/main.py @@ -0,0 +1,167 @@ +from flask import Flask, render_template, request, jsonify +import requests + +app = Flask(__name__) +BASE_URL = "https://meteo.cbpio.pl" + +@app.route("/gui/weather") +def simple_weather(): + city = request.args.get("city", "Warszawa") + + if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""): + try: + response = requests.get(f"https://meteo.cbpio.pl/weather", params={"city": city}) + return jsonify(response.json()) + except Exception as e: + return jsonify({"error": str(e)}), 500 + + return render_template("weather.html") + +@app.route("/gui/weather/geo") +def geo_weather_page(): + lat = request.args.get("lat") + lon = request.args.get("lon") + + if not lat or not lon: + msg = {"error": "Podaj współrzędne, np. ?lat=52.4&lon=16.9"} + if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""): + return jsonify(msg), 400 + return msg["error"], 400 + + try: + response = requests.get("https://meteo.cbpio.pl/weather/geo", params={"latitude": lat, "longitude": lon}) + data = response.json() + except Exception as e: + error_msg = {"error": str(e)} + if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""): + return jsonify(error_msg), 500 + return f"Błąd: {e}", 500 + + if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""): + return jsonify(data) + + return render_template("geo_weather.html", weather=data) + +@app.route("/gui/forecast") +def forecast(): + city = request.args.get("city", "").strip() + if not city: + return render_template("forecast.html", city="", error="Nie podano miasta") + + try: + forecast_data = requests.get(f"{BASE_URL}/forecast", params={"city": city}).json() + except Exception as e: + return render_template("forecast.html", city=city, error="Błąd pobierania danych") + + accept = request.headers.get("Accept", "") + if "application/json" in accept: + return jsonify(forecast_data) + + return render_template("forecast.html", city=forecast_data["city"], forecast=forecast_data["forecast"]) + +@app.route("/gui/forecast/hourly") +def hourly_forecast(): + city = request.args.get("city", "").lower() + hours = request.args.get("hours", 24, type=int) + + if not city: + return "Brak parametru 'city'", 400 + + try: + resp = requests.get("https://meteo.cbpio.pl/forecast/hourly", params={"city": city, "hours": hours}) + resp.raise_for_status() + data = resp.json() + except Exception as e: + error_msg = f"Błąd pobierania danych: {str(e)}" + if "text/html" in request.headers.get("Accept", ""): + return render_template("hourly_forecast.html", city=city.capitalize(), hourly_forecast=None, error=error_msg) + return jsonify({"error": error_msg}), 500 + + hourly = data.get("hourly_forecast", {}) + + if "text/html" in request.headers.get("Accept", ""): + return render_template("hourly_forecast.html", city=city.capitalize(), hourly_forecast=hourly, error=None) + else: + return jsonify(data) + +@app.route("/gui/history/range") +def history_range(): + city = request.args.get("city", "").lower() + start_date = request.args.get("start_date") + end_date = request.args.get("end_date") + accept = request.headers.get("Accept", "") + + if not city or not start_date or not end_date: + error_msg = "Brak wymaganych parametrów" + if "text/html" in accept: + return render_template("history_range.html", city=city.capitalize(), + start_date=start_date, end_date=end_date, + history=None, error=error_msg) + else: + return jsonify({"error": error_msg}), 400 + + url = f"https://meteo.cbpio.pl/history-range?city={city}&start_date={start_date}&end_date={end_date}" + + try: + res = requests.get(url) + res.raise_for_status() + data = res.json() + except Exception as e: + if "text/html" in accept: + return render_template("history_range.html", city=city.capitalize(), + start_date=start_date, end_date=end_date, + history=None, error=str(e)) + else: + return jsonify({"error": str(e)}), 500 + + history = data.get("history") + + if "text/html" in accept: + return render_template("history_range.html", city=city.capitalize(), + start_date=start_date, end_date=end_date, + history=history, error=None) + else: + return jsonify({ + "city": city.capitalize(), + "start_date": start_date, + "end_date": end_date, + "history": history + }) + +@app.route("/app/") +def index(): + return render_template("index.html") + +@app.route("/app/get_weather", methods=["POST"]) +def get_weather(): + data = request.get_json() + lat = data.get("lat") + lon = data.get("lon") + + if lat is None or lon is None: + return jsonify({"error": "Missing coordinates"}), 400 + + try: + current = requests.get(f"{BASE_URL}/weather/geo", params={"latitude": lat, "longitude": lon}).json() + forecast = requests.get(f"{BASE_URL}/forecast/geo", params={ + "latitude": lat, + "longitude": lon, + "days": 7 + }).json() + hourly = requests.get(f"{BASE_URL}/forecast/hourly/geo", params={ + "latitude": lat, + "longitude": lon, + "hours": 24 + }).json() + + return jsonify({ + "current": current, + "daily": forecast, + "hourly": hourly + }) + except Exception as e: + print("Error fetching data:", e) + return jsonify({"error": str(e)}), 500 + +if __name__ == "__main__": + app.run(debug=True, host='0.0.0.0', port=8000)