| import ffmpeg | |
| from app.config import Settings | |
| settings = Settings() | |
| class Stream: | |
| def __init__(self, stream_data: dict): | |
| self.stream_data = stream_data | |
| self.url = stream_data["url"] | |
| self.format = stream_data["format"] | |
| self.quality = stream_data["quality"] | |
| self.mime_type = stream_data["mimeType"] | |
| self.codec = stream_data["codec"] | |
| self.audio_track_id = stream_data["audioTrackId"] | |
| self.audio_track_name = stream_data["audioTrackName"] | |
| self.audio_track_locale = stream_data["audioTrackLocale"] | |
| self.video_only = stream_data["videoOnly"] | |
| self.itag = stream_data["itag"] | |
| self.bitrate = stream_data["bitrate"] | |
| self.init_start = stream_data["initStart"] | |
| self.init_end = stream_data["initEnd"] | |
| self.index_start = stream_data["indexStart"] | |
| self.index_end = stream_data["indexEnd"] | |
| self.width = stream_data["width"] | |
| self.height = stream_data["height"] | |
| self.fps = stream_data["fps"] | |
| self.content_length = stream_data["contentLength"] | |
| def download_stream( | |
| stream: Stream, | |
| title: str, | |
| file_type: str, | |
| ) -> str: | |
| output_path = f"{settings.download_path}/{file_type}" | |
| file_name = f"{file_type}_{title}" | |
| file_path = f"{output_path}/{file_name}.{get_file_ext_from_format(stream.format)}" | |
| if file_type == "video": | |
| video_stream = ffmpeg.input(stream.url) | |
| ffmpeg.output( | |
| video_stream, | |
| filename=file_path, | |
| format=get_file_ext_from_format(stream.format), | |
| vcodec="copy", | |
| strict="experimental", | |
| ).overwrite_output().run() | |
| elif file_type == "audio": | |
| audio_stream = ffmpeg.input(stream.url) | |
| ffmpeg.output( | |
| audio_stream, | |
| filename=file_path, | |
| format=get_file_ext_from_format(stream.format), | |
| acodec="copy", | |
| strict="experimental", | |
| ).overwrite_output().run() | |
| return file_path | |
| def get_file_ext_from_format(format: str) -> str: | |
| match format: | |
| case "M4A": | |
| return "mp4" | |
| case "WEBMA_OPUS": | |
| return "webm" | |
| case "WEBMA_VORBIS": | |
| return "webm" | |
| case "WEBM": | |
| return "webm" | |
| case "WEBM_OPUS": | |
| return "webm" | |
| case "WEBM_VORBIS": | |
| return "webm" | |
| case "MPEG_4": | |
| return "mp4" | |
| case _: | |
| return "mp4" | |