Spaces:
Sleeping
Sleeping
| """ | |
| Represents a Youtube video | |
| """ | |
| import logging | |
| import shutil | |
| import uuid | |
| from yt_dlp import YoutubeDL | |
| import os | |
| from pathlib import Path | |
| import ffmpeg | |
| format = "%(asctime)s: %(message)s" | |
| logging.basicConfig(format=format, level=logging.DEBUG, | |
| datefmt="%H:%M:%S") | |
| class YoutubeMedia: | |
| def __init__(self, url, dir, audio_format="wav", video_format="mp4"): | |
| self.url=url | |
| self.dir=dir | |
| self.audio_format=audio_format | |
| self.video_format=video_format | |
| def download(self): | |
| ydl_opts = { | |
| 'outtmpl': os.path.join(self.dir, "%(id)s_%(epoch)s.%(ext)s"), | |
| 'logger': logging, | |
| 'progress_hooks': [self.progress_hook], | |
| 'format': f'{self.video_format}/bestvideo', | |
| 'keepvideo': True, | |
| 'postprocessors': [{ # Extract audio using ffmpeg | |
| 'key': 'FFmpegExtractAudio', | |
| 'preferredcodec': self.audio_format | |
| }] | |
| } | |
| with YoutubeDL(ydl_opts) as ydl: | |
| error_code = ydl.download([self.url.url]) | |
| def resample(self,sr='16k'): #defaults to 16k sampling rate | |
| tmp_filename=os.path.join(self.dir,str(uuid.uuid4()))+"."+self.audio_format | |
| ffmpeg.input(self.audio_filename).output(tmp_filename,ar=sr).run() | |
| shutil.move(tmp_filename, self.audio_filename) | |
| logging.info(f"Succesfuly resampled {self.audio_filename}") | |
| def clean(self): | |
| if not self.audio_filename: | |
| logging.error("Audio not downloaded") | |
| return | |
| location=os.path.join(self.dir, self.audio_filename) | |
| if os.path.exists(self.audio_filename): | |
| os.remove(self.audio_filename) | |
| logging.info(f"File {self.audio_filename} successfully removed") | |
| self.audio_filename=None | |
| else: | |
| print(f"File {self.audio_filename} does not exist") | |
| def progress_hook(self, d): | |
| if d['status'] == 'finished': | |
| self.audio_filename=os.path.join(self.dir, Path(d.get('info_dict').get('_filename')).stem + "."+self.audio_format) | |
| self.video_filename=os.path.join(self.dir, Path(d.get('info_dict').get('_filename')).stem + "."+self.video_format) | |
| print(f'Done downloading {self.audio_filename}, now post-processing ...') | |