import os import gradio as gr import re def extract_shortcode(url): """Extract Instagram shortcode from various URL formats""" patterns = [ r'instagram\.com/p/([^/?]+)', r'instagram\.com/reel/([^/?]+)', r'instagram\.com/tv/([^/?]+)', ] for pattern in patterns: match = re.search(pattern, url) if match: return match.group(1) return None def download_reel_audio(url, output_folder="downloads"): """ Download audio from Instagram reel using instaloader """ try: import instaloader # Clean URL and create output directory clean_url = url.split('?')[0].strip() shortcode = extract_shortcode(clean_url) if not shortcode: return "Invalid Instagram URL", None os.makedirs(output_folder, exist_ok=True) # Create instaloader instance - download only what we need L = instaloader.Instaloader( download_pictures=False, download_videos=False, download_video_thumbnails=False, download_geotags=False, download_comments=False, save_metadata=False, compress_json=False ) # Get post info post = instaloader.Post.from_shortcode(L.context, shortcode) if not post.is_video: return "This post doesn't contain a video", None # Get video URL directly video_url = post.video_url # Download video content import requests headers = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15', } response = requests.get(video_url, headers=headers) if response.status_code != 200: return f"Failed to download video: {response.status_code}", None # Save video temporarily import tempfile with tempfile.NamedTemporaryFile(delete=False, suffix='.mp4') as temp_video: temp_video.write(response.content) temp_video_path = temp_video.name # Extract audio using ffmpeg audio_filename = f"instagram_audio_{shortcode}.mp3" audio_path = os.path.join(output_folder, audio_filename) import subprocess cmd = [ 'ffmpeg', '-i', temp_video_path, '-vn', '-acodec', 'mp3', '-ab', '192k', '-y', audio_path ] result = subprocess.run(cmd, capture_output=True, text=True) # Clean up temp file os.unlink(temp_video_path) if result.returncode != 0: return f"Audio extraction failed: {result.stderr}", None return "Audio downloaded successfully!", audio_path except ImportError: return "Please install: pip install instaloader requests", None except Exception as e: return f"Error downloading audio: {str(e)}", None # Gradio Interface interface = gr.Interface( fn=download_reel_audio, inputs=gr.Textbox( label="Instagram Reel URL", placeholder="Enter public Instagram reel URL (e.g., https://www.instagram.com/reel/...)" ), outputs=[ gr.Textbox(label="Status"), gr.Audio(label="Downloaded Audio") ], title="Instagram Reel to Audio Downloader", description="Enter URL of a public Instagram reel to download its audio as MP3", theme="default" ) if __name__ == "__main__": interface.launch()