import streamlit as st from pytube import YouTube from pytube.exceptions import VideoUnavailable class YouTubeDownloader: @staticmethod def run(): st.header("유튜브(Youtube) 영상 URL로 다운로드") url = st.text_input("Enter YouTube URL to download:") if url: YouTubeDownloader.validate_url(url) try: with st.expander("preview video"): st.video(url) if st.button("Download"): YouTubeDownloader.cleanup() file_ = YouTubeDownloader.download_video(url) if file_: # file_ 이 None이 아닐 때만 비디오 표시 st.video(file_) YouTubeDownloader.helper_message() except Exception as e: st.error(f"Error: {str(e)}") st.markdown("예) https://www.youtube.com/watch?v=hXpNj1ChxRI ") @staticmethod def download_video(url): try: with st.spinner("Downloading..."): yt = YouTube(url) stream = yt.streams.filter(progressive=True, file_extension="mp4").first() if stream: local_file = stream.download() st.success("Downloaded") return local_file else: st.error("No suitable stream found for this video") return None except VideoUnavailable: st.error("This video is unavailable") return None except Exception as e: st.error(f"An error occurred: {str(e)}") return None @staticmethod def validate_url(url): import validators if not validators.url(url): st.error("URL이 정상적이지 않습니다.") st.stop() @classmethod def cleanup(cls): import pathlib import glob junks = glob.glob("*.mp4") for junk in junks: pathlib.Path(junk).unlink() @classmethod def helper_message(cls): st.write( "영상 화면 우측 하단 ... 버튼을 클릭하면 다운로드 할 수 있습니다." ) if __name__ == "__main__": YouTubeDownloader.run()