## 相關資料 - 動畫瘋匯出(? - Chrome extension: [Video DownloadHelper](https://chromewebstore.google.com/detail/video-downloadhelper/lmjnegcaeklhafolokijcfjliaokphfk) - [CoApp](https://www.downloadhelper.net/install-coapp-v2) - OCR - [EasyOCR](https://github.com/JaidedAI/EasyOCR) - [video-subtitle-extractor](https://github.com/YaoFANGUK/video-subtitle-extractor) > Help and generated by gpt-4o ## MVP Backend System Requirements Specification (SRS) **Project Name**: Anime Subtitle Search and Meme Frame Generator MVP **Technology Stack**: Node.js, Express, SQLite, FFmpeg **Primary Use Case**: Build a backend service that supports video subtitle search and frame extraction for creating memes. --- ## 1. Overview The MVP backend system will enable the following core functionalities: - Accept an anime video and a subtitle file (SRT). - Extract frames from the video based on subtitle timings using FFmpeg. - Provide a search interface to retrieve subtitle blocks and their corresponding frames. - Allow users to vote on the most suitable frames for meme creation. - Store all generated frames, subtitle data, and voting information in a structured and efficient manner. --- ## 2. Functional Requirements ### 2.1 Video and Subtitle Management **FR-1.1 Video Upload and Storage** - The system shall accept an anime video file (e.g., MP4) uploaded by the user or obtained from a source (e.g., YouTube). - The video metadata (e.g., title, duration, file path) shall be stored in the `videos` table in the database. - The uploaded video file shall be saved on the server's filesystem in a predefined folder structure. **FR-1.2 Subtitle File Upload and Parsing** - The system shall accept an SRT subtitle file associated with the uploaded video. - The subtitle file shall be parsed, and each subtitle block (with start/end times and text) shall be stored in the `subtitles` table in the database, linked to the corresponding video. --- ### 2.2 Frame Extraction and Storage **FR-2.1 Subtitle to Frame Extraction** - The system shall use **FFmpeg** to extract frames from the video based on the timing of the subtitle blocks. - The system shall generate frames at the midpoint of each subtitle block and ±1 second variations. - The system shall store the extracted frames as PNG files in a structured directory format, organized by video and subtitle. **FR-2.2 Frame Storage in Database** - The system shall store the metadata of each generated frame (e.g., video ID, subtitle ID, frame time, file path) in the `frames` table. - The system shall ensure the generated frames are accessible and retrievable based on subtitle search queries. --- ### 2.3 Subtitle Search and Frame Retrieval **FR-3.1 Subtitle Search** - The system shall provide an API that allows users to search for subtitles using keywords. - The search results shall return subtitle blocks, including start/end times, subtitle text, and corresponding frames. **FR-3.2 Frame Retrieval** - For each searched subtitle block, the system shall return all associated frames (including variations) for display in the user interface. - The system shall allow users to retrieve the file path of a specific frame to download or share the image. --- ### 2.4 Voting on Frames **FR-4.1 Voting API** - The system shall provide an API that allows users to upvote or downvote frames. - Each vote shall be linked to a specific frame in the `votes` table, recording the user (or anonymous ID), vote type (upvote or downvote), and timestamp. **FR-4.2 Frame Ranking** - The system shall calculate the ranking of frames based on user votes and return the most popular frame for a specific subtitle block when requested. --- ## 3. Non-Functional Requirements ### 3.1 Performance - The system shall process and generate frames in under 5 seconds for a 2-minute video clip. - The search queries for subtitles shall return results in less than 1 second for keyword-based searches. ### 3.2 Scalability - The system shall be designed to handle multiple video uploads and frame extractions concurrently. ### 3.3 Data Storage - The system shall use **SQLite** for local development and testing to store video, subtitle, frame, and vote data. **PostgreSQL** may be used for future scalability. - The extracted frames shall be stored in the filesystem under `/frames/{video_id}/{subtitle_id}/`. ### 3.4 Error Handling - The system shall provide detailed error responses if the subtitle or video files are not valid or fail to process. - The system shall handle API request errors with appropriate HTTP status codes (e.g., 400 Bad Request, 500 Internal Server Error). --- ## 4. API Specifications ### 4.1 Upload Video - **Method**: `POST /api/videos` - **Input**: - Video file (MP4, AVI, etc.) - Video metadata (title, series, episode number) - **Output**: Video ID, status (success/failure) ### 4.2 Upload Subtitle - **Method**: `POST /api/subtitles` - **Input**: - Subtitle file (SRT) - Associated video ID - **Output**: Subtitle processing status (success/failure) ### 4.3 Search Subtitles - **Method**: `GET /api/subtitles/search` - **Input**: - Query string (keywords) - **Output**: List of subtitle blocks (start time, end time, text) and associated frames ### 4.4 Retrieve Frames for Subtitle - **Method**: `GET /api/frames/{subtitle_id}` - **Input**: - Subtitle ID - **Output**: List of frames (file paths, time stamps) ### 4.5 Vote on Frame - **Method**: `POST /api/frames/{frame_id}/vote` - **Input**: - Frame ID, vote type (upvote/downvote) - **Output**: Vote status (success/failure) --- ## 5. Data Models ### 5.1 Video Model ```json { "id": "xyz456", "title": "Anime Episode 1", "file_path": "/videos/xyz456.mp4", "duration": 1440, "created_at": "2024-10-12T12:00:00Z", "source_type": "user_upload" } ``` ### 5.2 Subtitle Model ```json { "id": "abc123", "video_id": "xyz456", "start_time": 120.0, "end_time": 125.0, "text": "This is a sample subtitle." } ``` ### 5.3 Frame Model ```json { "id": "def789", "video_id": "xyz456", "subtitle_id": "abc123", "frame_time": 121.0, "file_path": "/frames/xyz456/abc123/frame_121000.png" } ``` ### 5.4 Vote Model ```json { "id": "ghi101", "frame_id": "def789", "user_id": "user123", "vote_type": "upvote", "created_at": "2024-10-12T12:05:00Z" } ``` ### 6. Assumptions and Constraints * The MVP will initially focus on one specific anime series where subtitle files (SRT) are available. * The video file sizes should be limited to 500MB for processing efficiency in the MVP. * The extracted frames will be stored on the server filesystem, and further storage optimizations (like CDN integration) can be added in later versions.