import requests import pandas as pd import streamlit as st import base64 import urllib import functions as f from st_aggrid import AgGrid, GridUpdateMode from st_aggrid.grid_options_builder import GridOptionsBuilder st.title("App Store Search") # User input search_terms = st.text_input("Enter keyword(s) or phrase(s) to search for apps (comma-separated):") cc, sl = st.columns((5,2)) with cc: country_codes = st.text_input("Enter one or more two-letter country code (e.g., 'GB' for the UK):", "GB") with sl: search_limit = st.number_input("Number of results per keyword:\n\n", min_value=1, max_value=1000, value=100, step=50) # Add rating filter slider rating_filter = st.slider("Show apps with rating under:", min_value=0.0, max_value=5.0, value=5.0, step=0.1) if st.button("Search"): if search_terms and country_codes: app_data = f.init_search(search_terms, country_codes, limit=search_limit) # Filter rows based on rating app_data = app_data[app_data['average_rating'] <= rating_filter] # Store the data in the session state so it doesn't get refreshed on each rerun st.session_state['app_data'] = app_data if 'app_data' in st.session_state: gd = GridOptionsBuilder.from_dataframe(st.session_state['app_data']) gd.configure_selection(selection_mode='multiple', use_checkbox=True) gridoptions = gd.build() grid_table = AgGrid(st.session_state['app_data'], height=250, gridOptions=gridoptions, update_mode=GridUpdateMode.SELECTION_CHANGED) if st.button("Process Selected Rows"): selected_row_dicts = grid_table["selected_rows"] selected_row = pd.DataFrame(selected_row_dicts) if 'link' in selected_row.columns: # Ensure 'link' column exists selected_row['fetch_name'], selected_row['fetch_id'] = zip(*selected_row['link'].apply(f.extract_name_id)) apps_to_fetch = {} for i, data in selected_row[:10][["name", "fetch_name", "fetch_id"]].iterrows(): apps_to_fetch[data["name"]] = {"iOS" : {data["fetch_name"] : data["fetch_id"]}, "Android": None} reviews = f.fetch_data(apps_to_fetch.items()) output_data = selected_row.merge(reviews, left_on="fetch_id", right_on="app_id", how="left") output_data = output_data.iloc[:,1:] st.dataframe(output_data) # Add download button st.download_button( label="Download CSV File", data=f.to_csv(selected_row), # Download only the selected rows file_name="app_data.csv", mime="text/csv", ) else: st.warning("No 'link' column found in selected rows.")