import gradio as gr import pandas as pd from main import SoundgasmScraper import time # Initialize the scraper scraper = SoundgasmScraper() def search_soundgasm(query, max_results=10): """ Search for audio on Soundgasm and return results in a formatted way """ if not query.strip(): return "Please enter a search query.", None try: # Show loading message results = scraper.search_audio(query, max_results=int(max_results)) if not results: return "No results found. Try a different search term.", None # Format results for display formatted_results = [] for i, result in enumerate(results, 1): formatted_result = f""" ### Result {i}: {result['audio_title'] or 'Untitled'} **Username:** {result['username'] or 'Unknown'} **Page URL:** [{result['url']}]({result['url']}) **Direct Audio URL:** {result['audio_url'] or 'Not found'} **Description:** {result['description'][:200] + '...' if result['description'] and len(result['description']) > 200 else result['description'] or 'No description available'} --- """ formatted_results.append(formatted_result) # Create a DataFrame for the table view df_data = [] for result in results: df_data.append({ 'Title': result['audio_title'] or 'Untitled', 'Username': result['username'] or 'Unknown', 'Page URL': result['url'], 'Audio URL': result['audio_url'] or 'Not found', 'Description': (result['description'][:100] + '...' if result['description'] and len(result['description']) > 100 else result['description']) or 'No description' }) df = pd.DataFrame(df_data) return "\n".join(formatted_results), df except Exception as e: return f"Error occurred during search: {str(e)}", None def search_by_user(username): """ Search for all audios by a specific username """ if not username.strip(): return "Please enter a username.", None try: results = scraper.search_by_username(username.strip()) if not results: return f"No audios found for user '{username}' or user doesn't exist.", None # Format results for display formatted_results = [] for i, result in enumerate(results, 1): formatted_result = f""" ### Audio {i}: {result['audio_title'] or 'Untitled'} **Page URL:** [{result['url']}]({result['url']}) **Direct Audio URL:** {result['audio_url'] or 'Not found'} **Description:** {result['description'][:200] + '...' if result['description'] and len(result['description']) > 200 else result['description'] or 'No description available'} --- """ formatted_results.append(formatted_result) # Create a DataFrame for the table view df_data = [] for result in results: df_data.append({ 'Title': result['audio_title'] or 'Untitled', 'Page URL': result['url'], 'Audio URL': result['audio_url'] or 'Not found', 'Description': (result['description'][:100] + '...' if result['description'] and len(result['description']) > 100 else result['description']) or 'No description' }) df = pd.DataFrame(df_data) return "\n".join(formatted_results), df except Exception as e: return f"Error occurred during user search: {str(e)}", None # Create the Gradio interface with gr.Blocks(title="Soundgasm Audio Search", theme=gr.themes.Base()) as app: gr.Markdown(""" # 🎧 Soundgasm Audio Search Search for audio content on Soundgasm.net and get direct links to the audio files. **Features:** - Search by keywords - Search by username - Get direct audio file URLs - View audio descriptions and metadata """) with gr.Tabs(): # Search by keywords tab with gr.TabItem("🔍 Search by Keywords"): with gr.Row(): with gr.Column(scale=3): search_input = gr.Textbox( label="Search Query", placeholder="Enter keywords (e.g., ASMR, relaxing, etc.)", lines=1 ) with gr.Column(scale=1): max_results_input = gr.Slider( minimum=1, maximum=20, value=10, step=1, label="Max Results" ) search_button = gr.Button("🔍 Search", variant="primary") with gr.Row(): with gr.Column(): search_output = gr.Markdown(label="Search Results") with gr.Column(): search_table = gr.Dataframe( label="Results Table", interactive=False, wrap=True ) # Search by username tab with gr.TabItem("👤 Search by Username"): username_input = gr.Textbox( label="Username", placeholder="Enter Soundgasm username", lines=1 ) user_search_button = gr.Button("🔍 Search User", variant="primary") with gr.Row(): with gr.Column(): user_output = gr.Markdown(label="User's Audios") with gr.Column(): user_table = gr.Dataframe( label="User's Audios Table", interactive=False, wrap=True ) # Instructions with gr.Accordion("📖 How to Use", open=False): gr.Markdown(""" ### Search by Keywords: 1. Enter keywords related to the audio you're looking for 2. Adjust the maximum number of results if needed 3. Click "Search" to find matching audios ### Search by Username: 1. Enter a Soundgasm username 2. Click "Search User" to see all audios from that user ### Results: - **Page URL**: Link to the Soundgasm page - **Audio URL**: Direct link to the audio file (m4a format) - **Description**: Audio description if available ### Note: - This tool searches using external search engines, so results may vary - Some audio URLs might not be extractable due to page structure changes - Always respect the content creators' rights and terms of service """) # Event handlers search_button.click( fn=search_soundgasm, inputs=[search_input, max_results_input], outputs=[search_output, search_table] ) user_search_button.click( fn=search_by_user, inputs=[username_input], outputs=[user_output, user_table] ) # Allow Enter key to trigger search search_input.submit( fn=search_soundgasm, inputs=[search_input, max_results_input], outputs=[search_output, search_table] ) username_input.submit( fn=search_by_user, inputs=[username_input], outputs=[user_output, user_table] ) # Launch the app if __name__ == "__main__": app.launch( server_name="0.0.0.0", server_port=7860, share=False, debug=True )