Spaces:
Sleeping
Sleeping
| import yt_dlp | |
| import os | |
| import glob | |
| def sanitize_filename(filename: str, max_length: int = 20) -> str: | |
| """ | |
| ファイル名を安全な形式に変換し、長さを制限する | |
| """ | |
| # 日本語をASCIIに置き換える(必要に応じて削除) | |
| sanitized = "".join(c if c.isalnum() or c in "._-" else "_" for c in filename) | |
| return sanitized[:max_length] | |
| def download_youtube(youtube_url: str) -> str: | |
| video_info = get_video_info(youtube_url) | |
| title = video_info["title"] | |
| title = sanitize_filename(title) | |
| ydl_opts = { | |
| 'postprocessors': [ | |
| { | |
| 'key': 'FFmpegExtractAudio', | |
| 'preferredcodec': 'mp3', | |
| 'preferredquality': '128', | |
| } | |
| ], | |
| 'format': 'bestaudio+worstvideo', | |
| 'outtmpl': title | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| info_dict = ydl.extract_info(youtube_url, download=True) | |
| file_path = ydl.prepare_filename(info_dict) | |
| filename, _ = os.path.splitext(file_path) | |
| filename += ".mp3" | |
| print(f"Downloaded file path: {filename}") | |
| return filename | |
| def download_youtube_video(youtube_url: str) -> str: | |
| video_info = get_video_info(youtube_url) | |
| title = video_info["title"] | |
| title = sanitize_filename(title) | |
| ydl_opts = { | |
| 'format': 'bestaudio+worstvideo', | |
| 'outtmpl': title | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| info_dict = ydl.extract_info(youtube_url, download=True) | |
| file_path = ydl.prepare_filename(info_dict) + ".mp4" | |
| print(f"Downloaded file path: {file_path}") | |
| return file_path | |
| def remove_mp4_file(): | |
| print("remove_mp4_file") | |
| mp4_files = glob.glob(os.path.join("./", '*.mp4')) | |
| for file in mp4_files: | |
| try: | |
| os.remove(file) | |
| except Exception as e: | |
| print(f"削除失敗: {file} - {e}") | |
| def get_video_info(url): | |
| ydl_opts = { | |
| 'dump_single_json': True, | |
| 'skip_download': True, | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| info = ydl.extract_info(url, download=False) | |
| return info | |