import gradio as gr import requests import io import os from PIL import Image from googleapiclient.discovery import build # API and Model Setup using environment variables for security headers = {"Authorization": os.getenv('HF_API_KEY')} YOUTUBE_DATA_API = os.getenv('YOUTUBE_API_KEY') mealdb_base_url = os.getenv('MEALDB_BASE_URL') youtube = build('youtube', 'v3', developerKey=YOUTUBE_DATA_API) # Function to convert image to base64 (unused in this script but defined) def image_to_base64(image): buffered = io.BytesIO() image.save(buffered, format="JPEG") import base64 return base64.b64encode(buffered.getvalue()).decode('utf-8') # Function to perform inference on the image using a Hugging Face model def perform_inference(image): buffered = io.BytesIO() image.save(buffered, format="JPEG") data = buffered.getvalue() model_url = "https://api-inference.huggingface.co/models/juliensimon/autotrain-food101-1471154053" response = requests.post(model_url, headers=headers, data=data) result = response.json() return result[0]['label'] # Function to search YouTube videos based on a query def search_youtube_videos(query): search_params = { 'q': query + " recipe", 'part': 'snippet', 'maxResults': 5, 'type': 'video', } search_response = youtube.search().list(**search_params).execute() video_ids = [item['id']['videoId'] for item in search_response['items']] return [f"https://www.youtube.com/embed/{video_id}" for video_id in video_ids] # Function to get recipe details from TheMealDB def get_recipe_details(query): response = requests.get(f"{mealdb_base_url}search.php?s={query}") data = response.json() meals = data.get('meals', []) if meals: meal_id = meals[0]['idMeal'] details_response = requests.get(f"{mealdb_base_url}lookup.php?i={meal_id}") details_data = details_response.json() recipe = details_data['meals'][0] ingredients = "\n".join([f"{recipe[f'strIngredient{i}']}: {recipe[f'strMeasure{i}']}" for i in range(1, 21) if recipe[f'strIngredient{i}']]) return f"{recipe['strMeal']} -\n\nSteps:\n{recipe['strInstructions']}\n\nIngredients:\n{ingredients}" return "Recipe details not found." # Function to generate HTML content for embedding videos def generate_embed_html(video_links): html_content = "
" for video in video_links: html_content += f'' html_content += "
" return html_content # Gradio interface function that handles image uploads and processes the data def gradio_interface(image): dish_name = perform_inference(image) youtube_links = search_youtube_videos(dish_name) recipe_details = get_recipe_details(dish_name) youtube_html = generate_embed_html(youtube_links) return dish_name, recipe_details, youtube_html iface = gr.Interface( fn=gradio_interface, inputs=gr.Image(type="pil", label="Upload an Image"), outputs=[ gr.Textbox(label="Predicted Dish"), gr.Textbox(label="Recipe Details"), gr.HTML(label= "YouTube Recipe Videos") # Changed to gr.HTML ], title="Dish Prediction, Recipe Details, and Recipe Videos", description="Upload an image of food, and the app will predict the dish, provide YouTube links for recipes, and fetch detailed recipe instructions." ) if __name__ == "__main__": iface.launch()