Spaces:
Sleeping
Sleeping
File size: 5,740 Bytes
e3d2211 8f4d406 e3d2211 8f4d406 12d2411 8f4d406 e3d2211 12d2411 e3d2211 ed946ba 8f4d406 12d2411 8f4d406 e3d2211 8f4d406 033af54 8f4d406 e3d2211 8f4d406 d38f151 033af54 d38f151 e3d2211 8f4d406 e3d2211 8f4d406 e3d2211 8f4d406 12d2411 8f4d406 d38f151 8f4d406 e3d2211 d38f151 e3d2211 ed946ba e3d2211 ed946ba 8f4d406 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
import os
import hashlib
import time
import threading
import requests
from flask import Flask, render_template, request, jsonify, Response, send_file, url_for
from bs4 import BeautifulSoup
from flask_caching import Cache
app = Flask(__name__)
# Configure in-memory caching for non-image routes
app.config['CACHE_TYPE'] = 'SimpleCache'
app.config['CACHE_DEFAULT_TIMEOUT'] = 300 # Cache responses for 5 minutes
cache = Cache(app)
# Directory to store cached images
CACHE_DIR = "cache_images"
if not os.path.exists(CACHE_DIR):
os.makedirs(CACHE_DIR)
def get_cache_filename(url):
"""Generate a unique filename for a given URL."""
h = hashlib.md5(url.encode('utf-8')).hexdigest()
# Here we assume JPEG. You might want to derive extension from url or headers.
return os.path.join(CACHE_DIR, f"{h}.jpg")
# 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"
}
# 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_param = ""
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 proxying on every request, pass the external URL to the template.
image_url_param = 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_param=image_url_param)
# Cache this route based on its query string.
@app.route('/fetch_weeks')
@cache.cached(timeout=300, query_string=True)
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})
# New endpoint to serve a locally cached image file.
@app.route('/cached-image')
def cached_image_route():
external_url = request.args.get('url')
if not external_url:
return "Missing URL", 400
cache_filename = get_cache_filename(external_url)
if os.path.exists(cache_filename):
return send_file(cache_filename, mimetype="image/jpeg")
else:
try:
resp = requests.get(external_url, timeout=10)
if resp.status_code == 200:
with open(cache_filename, "wb") as f:
f.write(resp.content)
return send_file(cache_filename, mimetype=resp.headers.get('Content-Type', 'image/jpeg'))
else:
return "Error downloading image", resp.status_code
except Exception as e:
return str(e), 500
if __name__ == '__main__':
app.run(debug=True)
|