Spaces:
Sleeping
Sleeping
Sharan Thakur
Add initial implementation of YouTube audio summarizer with Gemini API integration
f8c4214
| from logging import getLogger | |
| from typing import Generator, Optional | |
| from models import YTResult | |
| import yt_dlp | |
| logger = getLogger(__name__) | |
| def __get_audio(result: YTResult) -> Optional[YTResult]: | |
| try: | |
| with open(f"output/{result.id}.m4a", "rb") as f: | |
| return result | |
| except FileNotFoundError: | |
| return None | |
| def __my_hook(d): | |
| if d["status"] == "error": | |
| logger.info("Error downloading video") | |
| elif d["status"] == "downloading": | |
| downloaded_bytes = d.get("downloaded_bytes", 0) | |
| total_bytes_estimate = d.get("total_bytes_estimate", 1) | |
| percent = downloaded_bytes / total_bytes_estimate * 100 | |
| logger.info(f"Downloaded {percent:.2f}%") | |
| elif d["status"] == "finished": | |
| logger.info("Download finished") | |
| def __get_options(): | |
| return { | |
| "format": "m4a/bestaudio/best", | |
| "outtmpl": "output/%(id)s.%(ext)s", | |
| "progress_hooks": [__my_hook], | |
| } | |
| def extract_info(link: str) -> YTResult: | |
| with yt_dlp.YoutubeDL(__get_options()) as ydl: | |
| info = ydl.extract_info(link, download=False) | |
| info_dict = ydl.sanitize_info(info) | |
| return YTResult( | |
| id=info_dict["id"], | |
| title=info_dict["title"], | |
| thumbnail_link=info_dict["thumbnail"], | |
| uploader=info_dict["uploader"], | |
| ) | |
| def simple_download_audio_from_youtube(link: str) -> YTResult: | |
| with yt_dlp.YoutubeDL(__get_options()) as ydl: | |
| info = ydl.extract_info(link, download=False) | |
| info_dict = ydl.sanitize_info(info) | |
| res = YTResult( | |
| id=info_dict["id"], | |
| title=info_dict["title"], | |
| thumbnail_link=info_dict["thumbnail"], | |
| uploader=info_dict["uploader"], | |
| ) | |
| local_link = __get_audio(res) | |
| if local_link: | |
| return res | |
| error_code = ydl.download([link]) | |
| res.error_code = error_code | |
| return res | |
| def download_audio_from_youtube(link: str) -> Generator[YTResult, None, None]: | |
| with yt_dlp.YoutubeDL(__get_options()) as ydl: | |
| info = ydl.extract_info(link, download=False) | |
| info_dict = ydl.sanitize_info(info) | |
| # Yield video metadata | |
| yield YTResult( | |
| id=info_dict["id"], | |
| title=info_dict["title"], | |
| thumbnail_link=info_dict["thumbnail"], | |
| uploader=info_dict["uploader"], | |
| ) | |
| # Start downloading and yield progress updates | |
| error_code = ydl.download([link]) | |
| yield YTResult( | |
| id=info_dict["id"], | |
| title=info_dict["title"], | |
| thumbnail_link=info_dict["thumbnail"], | |
| uploader=info_dict["uploader"], | |
| error_code=error_code, | |
| ) | |
| # Example Usage | |
| if __name__ == "__main__": | |
| yt_link = "https://www.youtube.com/watch?v=vf7bI5nZyi8" | |
| for update in download_audio_from_youtube(yt_link): | |
| logger.info(f"Video Info: {update}") | |