import gradio as gr from stock import * from indices_html import * from index_live_html import * from preopen_html import * from eq_html import * import pandas as pd from bhavcopy_html import * from nsepython import * from yahooinfo import fetch_info import datetime # ====================================================== # Scrollable HTML wrapper # ====================================================== SCROLL_WRAP = """
{{HTML}}
""" # ====================================================== # Date helpers # ====================================================== def today_str(): return datetime.date.today().strftime("%d-%m-%Y") def yesterday_str(): return (datetime.date.today() - datetime.timedelta(days=1)).strftime("%d-%m-%Y") def last_year_date(d): dt = datetime.datetime.strptime(d, "%d-%m-%Y") new_dt = dt.replace(year=dt.year - 1) return new_dt.strftime("%d-%m-%Y") # ====================================================== # HTML wrapper # ====================================================== def wrap(html): if html is None: return "

No Data

" return SCROLL_WRAP.replace("{{HTML}}", html) # ====================================================== # Request Type Options # ====================================================== STOCK_REQ = [ "info", "intraday", "daily", "nse_eq", "qresult", "result", "balance", "cashflow", "dividend", "split", "other", "stock_hist" ] INDEX_REQ = [ "indices", "nse_open", "nse_preopen", "nse_fno", "nse_fiidii", "nse_events", "nse_future", "nse_bhav", "nse_highlow", "index_history", "nse_largedeals", "nse_most_active", "largedeals_historical", "nse_bulkdeals", "nse_blockdeals", "index_pe_pb_div", "index_total_returns" ] # ====================================================== # Update UI based on mode # ====================================================== def update_on_mode(mode): if mode == "stock": return ( gr.update(choices=STOCK_REQ, value="info"), gr.update(value="ITC"), gr.update(value=yesterday_str()) ) elif mode == "index": return ( gr.update(choices=INDEX_REQ, value="indices"), gr.update(value="NIFTY 50"), gr.update(value=yesterday_str()) ) return ( gr.update(choices=[], value=""), gr.update(value=""), gr.update(value="") ) # ====================================================== # Data Fetcher (API logic untouched) # ====================================================== def fetch_data(mode, req_type, name, date_str): req_type = req_type.lower() name = name.strip() date_str = date_str.strip() # ✅ Frontend may send empty date → auto yesterday if not date_str: date_str = yesterday_str() date_start = last_year_date(date_str) if mode == "index": if req_type == "indices": return build_indices_html() elif req_type == "nse_open": return build_index_live_html() elif req_type == "nse_preopen": return build_preopen_html() elif req_type == "nse_fno": return wrap(nse_fno(name)) elif req_type == "nse_events": return nse_events().to_html() elif req_type == "nse_fiidii": return nse_fiidii().to_html() elif req_type == "nse_future": return wrap(nse_future(name)) elif req_type == "nse_highlow": return wrap(nse_highlow()) elif req_type == "nse_bhav": return build_bhavcopy_html(date_str) elif req_type == "nse_largedeals": return nse_largedeals().to_html() elif req_type == "nse_bulkdeals": return nse_bulkdeals().to_html() elif req_type == "nse_blockdeals": return nse_blockdeals().to_html() elif req_type == "nse_most_active": return nse_most_active().to_html() elif req_type == "index_history": return index_history("NIFTY 50", date_start, date_str).to_html() elif req_type == "largedeals_historical": return nse_largedeals_historical(date_start, date_str).to_html() elif req_type == "index_pe_pb_div": return index_pe_pb_div("NIFTY 50", date_start, date_str).to_html() elif req_type == "index_total_returns": return index_total_returns("NIFTY 50", date_start, date_str).to_html() else: return wrap(f"

No handler for {req_type}

") elif mode == "stock": if req_type == "daily": return wrap(fetch_daily(name)) elif req_type == "nse_eq": return build_eq_html(name) elif req_type == "intraday": return wrap(fetch_intraday(name)) elif req_type == "info": return wrap(fetch_info(name)) elif req_type == "qresult": return wrap(fetch_qresult(name)) elif req_type == "result": return wrap(fetch_result(name)) elif req_type == "balance": return wrap(fetch_balance(name)) elif req_type == "cashflow": return wrap(fetch_cashflow(name)) elif req_type == "dividend": return wrap(fetch_dividend(name)) elif req_type == "split": return wrap(fetch_split(name)) elif req_type == "other": return wrap(fetch_other(name)) elif req_type == "stock_hist": return nse_stock_hist(date_start, date_str, name).to_html() else: return wrap(f"

No handler for {req_type}

") return wrap(f"

No valid mode: {mode}

") # ====================================================== # UI # ====================================================== with gr.Blocks(title="Stock / Index App") as iface: gr.Markdown("### **Stock / Index Data Fetcher**") with gr.Row(): mode_input = gr.Radio( ["stock", "index"], label="Mode", value="stock", scale=1 ) name_input = gr.Textbox( label="Symbol / Index Name", scale=2 ) req_type_input = gr.Dropdown( label="Request Type", allow_custom_value=True, scale=2 ) date_input = gr.Textbox( label="Date (DD-MM-YYYY)", placeholder="Leave empty = yesterday", scale=1 ) fetch_btn = gr.Button("Fetch", scale=1) output = gr.HTML(label="Output") # Mode change → auto defaults mode_input.change( update_on_mode, inputs=mode_input, outputs=[req_type_input, name_input, date_input] ) # Initial load defaults iface.load( update_on_mode, inputs=mode_input, outputs=[req_type_input, name_input, date_input] ) # Fetch fetch_btn.click( fetch_data, inputs=[mode_input, req_type_input, name_input, date_input], outputs=output ) # ====================================================== # Launch # ====================================================== if __name__ == "__main__": iface.launch(server_name="0.0.0.0", server_port=7860)