AOSSIE-Org / AOSSIE-Org/EduAid

[BUG] Missing validation and timeout handling in /getTranscript endpoint using yt-dlp

Đang mở
#539 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug
Ngôn ngữ chính
JavaScript
Star
171
Fork
425
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

### Bug Description

The `/getTranscript` endpoint executes a `yt-dlp` subprocess to download YouTube subtitles and extract the transcript.

Currently, the subprocess execution does not include proper validation, timeout handling, or exception handling.

Example code from the endpoint:

```python
subprocess.run(
["yt-dlp", "--write-auto-sub", "--sub-lang", "en", "--skip-download",
"--sub-format", "vtt", "-o", f"subtitles/{video_id}.vtt",
f"https://www.youtube.com/watch?v={video_id}"],
check=True, capture_output=True, text=True
)
```

If the command fails or subtitles are unavailable, `subprocess.run` raises a `CalledProcessError`. Since this exception is not caught, the Flask server returns a **500 Internal Server Error** instead of a structured JSON response.

Additionally:

- The endpoint does not validate the `videoId`
- No timeout is defined for the subprocess execution
- A long-running or hanging `yt-dlp` process may block the Flask worker

This affects the **reliability and stability of the backend API**.

---

### Steps to Reproduce

1. Run the backend server
2. Send a request to the endpoint

```
http://127.0.0.1:5000/getTranscript?videoId=dQw4w9WgXcQ
```

3. Observe the response.

---

## Observed Behavior

The server returns:

```
500 Internal Server Error
```

instead of returning a meaningful JSON error response.

---

## Expected Behavior

The endpoint should:

- Validate the provided `videoId`
- Handle subprocess failures gracefully
- Return a proper JSON error response instead of a server crash
- Add timeout protection for the subprocess execution

---

## Proposed Improvement

The endpoint should be updated to:

1. Validate `videoId` format before executing the command
2. Add a timeout parameter to `subprocess.run`
3. Handle subprocess exceptions such as:

- `subprocess.TimeoutExpired`
- `subprocess.CalledProcessError`

Example improvement:

```python
try:
subprocess.run(command, timeout=20, check=True)
except subprocess.TimeoutExpired:
return jsonify({"error": "Transcript extraction timed out"}), 504
except subprocess.CalledProcessError:
return jsonify({"error": "Failed to fetch subtitles"}), 500
```

These changes will improve the **security, stability, and reliability** of the transcript extraction endpoint.

---

### Logs and Screenshots

While testing the `/getTranscript` endpoint locally, the server returned an **Internal Server Error (500)** instead of a structured JSON response.

Example request:

http://127.0.0.1:5000/getTranscript?videoId=dQw4w9WgXcQ

Observed response in browser:

```
Internal Server Error
The server encountered an internal error and was unable to complete your request.
```

Screenshot of the error:
[https://drive.google.com/file/d/1MO8xcAGlXq8LtVSAX4bhTYA-DBMSngY8/view?usp=sharing
](url)

This indicates that the `yt-dlp` subprocess failure is not properly handled and results in an unhandled exception in the Flask application.

---

### Environment Details

- **Operating System:** Windows 11
- **Browser:** Google Chrome
- **Backend Framework:** Flask
- **Python Version:** Python 3.x
- **Server:** Local development server (Flask)
- **Endpoint Tested:** `/getTranscript`

### Impact

High - Major feature is broken

### Code of Conduct

- [x] I have joined the [Discord server](https://discord.gg/hjUhu33uAn) and will post updates there
- [x] I have searched existing issues to avoid duplicates

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.