from flask import Flask, request, jsonify from pytubefix import YouTube import re app = Flask(__name__) def download_video(url, resolution): try: yt = YouTube(url, use_po_token=True) stream = yt.streams.filter(progressive=True, file_extension='mp4', resolution=resolution).first() if stream: stream.download() return True, None else: return False, f"{resolution}のストリームが見つかりませんでした。利用可能: {[s.resolution for s in yt.streams.filter(progressive=True, file_extension='mp4')]}" except Exception as e: print(f"[Download Error] {e}") # ← ここでログを確認 return False, str(e) def get_video_info(url): try: yt = YouTube(url, use_po_token=True) video_info = { "title": yt.title, "author": yt.author, "length": yt.length, "views": yt.views, "description": yt.description, "publish_date": yt.publish_date.isoformat() if yt.publish_date else None } return video_info, None except Exception as e: print(f"[Video Info Error] {e}") return None, str(e) def is_valid_youtube_url(url): pattern = r"^(https?://)?(www\.)?(youtube\.com/watch\?v=|youtu\.be/)[\w-]+(&\S*)?$" return re.match(pattern, url) is not None @app.route('/download', methods=['GET']) def download_by_resolution(): url = request.args.get('url') resolution = request.args.get('resolution', '720p') if not url: return jsonify({"error": "'url' パラメーターが必要です。"}), 400 if not is_valid_youtube_url(url): return jsonify({"error": "無効なYouTube URLです。"}), 400 success, error_message = download_video(url, resolution) if success: return jsonify({"message": f"{resolution}の動画を正常にダウンロードしました。"}), 200 else: return jsonify({"error": error_message}), 500 @app.route('/video_info', methods=['GET']) def video_info(): url = request.args.get('url') if not url: return jsonify({"error": "'url' パラメーターが必要です。"}), 400 if not is_valid_youtube_url(url): return jsonify({"error": "無効なYouTube URLです。"}), 400 info, error_message = get_video_info(url) if info: return jsonify(info), 200 else: return jsonify({"error": error_message}), 500 if __name__ == '__main__': app.run(debug=True, host="0.0.0.0", port=7860)