from flask import Flask, render_template, request, jsonify, Response import requests from bs4 import BeautifulSoup from flask import stream_with_context app = Flask(__name__) # Internal mapping of crops to pests (for the form) CROP_TO_PESTS = { "Sorgum": ["FallArmyWorm"], "Maize": ["FallArmyWorm"], "Rice": ["Blast", "GallMidge", "YSB", "PlantHopper", "BlueBeetle", "BacterialLeafBlight"], "Cotton": ["Thrips", "Whitefly", "PinkBollworm", "Jassid", "BollRot", "AmericanBollworm"], "Soybean": ["Girdlebeetle", "H.armigera", "Semilooper", "Spodoptera", "StemFLy"], "Tur": ["Wilt", "Webbed_Leaves", "Pod_damage"], "Sugarcane": ["FallArmyGrub", "WhiteGrub"], "Gram": ["H.armigera", "Wilt"] } # Fixed year options for the form YEARS = ["2024-25", "2023-24", "2022-23", "2021-22"] # Map our internal crop names to the external page's crop values. CROP_MAPPING = { "Cotton": "1", "Gram": "4", "Maize": "7", "Rice": "3", "Sorghum": "6", "Soybean": "2", "Sugarcane": "8", "Tur": "5", "Sorgum": "6" # Adjust if needed } # Map our internal pest names to external page values per crop. PEST_MAPPING = { "Cotton": { "FallArmyWorm": "71" }, "Gram": { "H.armigera": "72", "Wilt": "73" }, "Maize": { "FallArmyWorm": "74" }, "Rice": { "Blast": "75", "GallMidge": "76", "YSB": "77", "PlantHopper": "78", "BlueBeetle": "79", "BacterialLeafBlight": "80" }, "Soybean": { "Girdlebeetle": "81", "H.armigera": "82", "Semilooper": "83", "Spodoptera": "84", "StemFLy": "85" }, "Tur": { "Wilt": "86", "Webbed_Leaves": "87", "Pod_damage": "88" }, "Sugarcane": { "FallArmyGrub": "89", "WhiteGrub": "90" }, "Sorgum": { "FallArmyWorm": "91" } } # Parameter codes and labels for the final image URL PARAMS = { "Mint": "Min Temperature", "Maxt": "Max Temperature", "RH": "Relative Humidity", "RF": "Rainfall", "PR": "Pest Report" } @app.route('/') def index(): # Read query parameters (if provided) crop = request.args.get('crop', '') pest = request.args.get('pest', '') year = request.args.get('year', '') week = request.args.get('week', '') param = request.args.get('param', '') image_url = "" if crop and pest and year and week and param: # Build the external image URL (using HTTP) base_url = f"http://www.icar-crida.res.in:8080/naip/gisimages/{crop}/{year}/{pest}_" external_image_url = f"{base_url}{param}{week}.jpg" # Instead of using the external HTTP URL directly, we build our proxy URL image_url = f"/proxy-image?url={external_image_url}" return render_template('index.html', crops=list(CROP_TO_PESTS.keys()), crop_to_pests=CROP_TO_PESTS, years=YEARS, params=PARAMS, selected_crop=crop, selected_pest=pest, selected_year=year, selected_week=week, selected_param=param, image_url=image_url) @app.route('/fetch_weeks') def fetch_weeks(): crop = request.args.get('crop', '') pest = request.args.get('pest', '') year = request.args.get('year', '') ext_crop = CROP_MAPPING.get(crop, '') ext_pest = "" if crop in PEST_MAPPING and pest in PEST_MAPPING[crop]: ext_pest = PEST_MAPPING[crop][pest] payload = { "country": ext_crop, "city": ext_pest, "sowing": year } weeks = [] try: response = requests.get("http://www.icar-crida.res.in:8080/naip/gismaps.jsp", params=payload, timeout=10) soup = BeautifulSoup(response.text, 'html.parser') week_options = soup.select('select[name="week"] option') weeks = [opt.get('value') for opt in week_options if opt.get('value') and "Select" not in opt.get('value')] if not weeks: weeks = [str(i) for i in range(1, 53)] except Exception as e: weeks = [str(i) for i in range(1, 53)] return jsonify({"weeks": weeks}) @app.route('/proxy-image') def proxy_image(): external_url = request.args.get('url') if not external_url: return "Missing URL", 400 try: # Use streaming so that the response is sent in chunks resp = requests.get(external_url, timeout=10, stream=True) return Response( stream_with_context(resp.iter_content(chunk_size=1024)), mimetype=resp.headers.get('Content-Type', 'image/jpeg') ) except Exception as e: return str(e), 500 if __name__ == '__main__': app.run(debug=True)