import subprocess, os, requests, json from utils.log import info from utils.subtitles import subs def Popen(cmd: list) -> str: """Run a command and return the output as a string Args: cmd (list): The command to run Returns: str: The output of the command """ return subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE).stdout.read().strip().decode('utf-8') class video: def __init__(self,id, path): self.path = path self.url = "https://youtu.be/" + id self.video_id = id # check if directory exists if not os.path.exists(self.path.split("/")[-1]): os.mkdir(self.path.split("/")[-1]) def download(self): if os.path.exists(f"{self.path}.webm"): info(f"{self.path}.webm already exists, skipping download") return info(f"Downloading {self.url}") # ( # Popen( # ["yt-dlp", self.url, "-o", self.path ] # ) # ) os.system(f"yt-dlp {self.url} -o {self.path}") def getframe(self, timestamp, out=os.curdir): filename = out if os.path.exists(filename): info(f"{filename} already exists, skipping frame") return info(f"Getting frame at {timestamp}") ( Popen( [ "ffmpeg", "-hide_banner", "-loglevel", "panic", "-ss", timestamp, "-i", f"{self.path}.webm", "-vframes", "1", filename ] ) ) def getAudio(self, out="out.mp3"): info("Getting audio...") ( Popen( [ "ffmpeg", "-hide_banner", "-loglevel", "panic", "-i", f"{self.path}.webm", "-vn", "-ar", "44100", "-ac", "2", "-ab", "192K", "-f", "mp3", out ] ) ) def getChapters(self, endpoint: str) -> list: """return the chapters of the video Args: endpoint (str): endpoint to communicate to get chapters yt.lemnoslife.com recommended Returns: list: chapters """ res = requests.get(f"{endpoint}") chapters = res.json()['items'][0]['chapters']['chapters'] return chapters def getSubtitles(self): """return the raw subtitles Returns: list: subtitles directly from youtube """ return json.loads( json.dumps( subs(self.video_id) .getSubsRaw() ) )