Spaces:
Paused
Paused
| from fastapi import FastAPI, HTTPException, Query | |
| from fastapi.responses import JSONResponse, FileResponse | |
| import os | |
| from yt_dlp import YoutubeDL | |
| # Define the FastAPI app | |
| app = FastAPI() | |
| # Directory to save downloaded videos | |
| DOWNLOAD_DIR = "downloads" | |
| os.makedirs(DOWNLOAD_DIR, exist_ok=True) | |
| def read_root(): | |
| return {"message": "Welcome to the Instagram Reel Downloader API"} | |
| def download_instagram_reel( | |
| reel_url: str = Query(..., description="The URL of the Instagram Reel to download"), | |
| ): | |
| """ | |
| Download an Instagram Reel using yt-dlp and provide a download link. | |
| Args: | |
| reel_url (str): The URL of the Instagram Reel. | |
| Returns: | |
| JSONResponse: A JSON object containing the download link. | |
| """ | |
| if not reel_url: | |
| raise HTTPException(status_code=400, detail="The 'reel_url' parameter is required.") | |
| # Define yt-dlp options | |
| ydl_opts = { | |
| "outtmpl": os.path.join(DOWNLOAD_DIR, "%(title)s.%(ext)s"), | |
| "quiet": True, # Suppress yt-dlp's output | |
| "merge_output_format": "mp4", | |
| } | |
| try: | |
| with YoutubeDL(ydl_opts) as ydl: | |
| info = ydl.extract_info(reel_url, download=True) | |
| original_filename = ydl.prepare_filename(info) | |
| # Ensure the file was created | |
| if not os.path.exists(original_filename): | |
| raise HTTPException(status_code=500, detail="Failed to download the Reel.") | |
| # Replace spaces with underscores in the filename | |
| base_name = os.path.basename(original_filename) | |
| sanitized_name = base_name.replace(" ", "_") | |
| sanitized_path = os.path.join(DOWNLOAD_DIR, sanitized_name) | |
| # Rename the file | |
| os.rename(original_filename, sanitized_path) | |
| # Construct the download link | |
| download_link = f"https://slimshadow-instagram-r-api.hf.space/files/{sanitized_name}" | |
| return JSONResponse(content={"download_link": download_link}) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}") | |
| def serve_file(file_name: str): | |
| """ | |
| Serve the downloaded file for users to download. | |
| """ | |
| file_path = os.path.join(DOWNLOAD_DIR, file_name) | |
| if not os.path.exists(file_path): | |
| raise HTTPException(status_code=404, detail="File not found.") | |
| return FileResponse(path=file_path, filename=file_name, media_type="video/mp4") | |