- Add core VLM modules (scanner, parser, planner, executor, analysis) - Add CLI with quarantine, reports, rollback, and state management - Add comprehensive test suite - Add project configuration and documentation - Add .gitignore for Python project
237 lines
17 KiB
Markdown
237 lines
17 KiB
Markdown
# Requirements Document
|
|
|
|
## Introduction
|
|
|
|
The Video Library Manager is a personal, semi-automated video library management tool written in Python for long-term use. It operates on video files stored on a FreeNAS system mounted via SMB on Windows 11. This tool provides a safe, transparent workflow to inspect, organize, and gradually clean an existing video library without acting as a downloader or media server.
|
|
|
|
The system follows a read-first, human-in-the-loop approach where all irreversible actions require explicit user confirmation. All file operations are expressed as reviewable execution plans, with no permanent deletion in v1 - unwanted files are moved to quarantine instead.
|
|
|
|
## Glossary
|
|
|
|
- **Video_Library_Manager**: The Python-based tool that manages video file organization
|
|
- **Inventory_Scanner**: Component that discovers and catalogs video files
|
|
- **Identity_Parser**: Component that extracts logical identity from filenames
|
|
- **Analysis_Engine**: Component that detects completeness and duplicates, and provides comparison data
|
|
- **Plan_Generator**: Component that creates structured, reviewable execution plans
|
|
- **Execution_Engine**: Component that safely executes file operations
|
|
- **Quarantine_Directory**: A `.quarantine/` subdirectory within the library root where unwanted files are moved
|
|
- **Dry_Run_Mode**: A simulation mode that shows what would happen without making changes
|
|
- **Execution_Plan**: A structured, reviewable document describing all file operations to be performed
|
|
- **Video_File**: A media file with extensions: .mp4, .mkv, .avi, .mov, .wmv, .flv, .webm, .m4v
|
|
- **Movie**: A standalone video file organized by title and year
|
|
- **Series**: An episodic TV series with continuous drama format
|
|
- **Season**: A collection of episodes within a series
|
|
- **Episode**: A single video file within a season
|
|
- **Anime**: Japanese animation content (deferred for v1 except inventory scanning)
|
|
- **Rollback_Log**: A record of all file operations that enables restoration to previous state
|
|
- **Configuration_File**: A user-editable file containing parsing rules, directory templates, and policies
|
|
|
|
## Requirements
|
|
|
|
### 1. Inventory Scanning
|
|
|
|
**User Story:** As a user, I want to scan my video library to discover all video files and record their metadata, so that I can understand the current state of my collection without making any modifications.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN the user initiates an inventory scan, THE Inventory_Scanner SHALL recursively discover all Video_Files within the specified root directory
|
|
2. WHEN a Video_File is discovered, THE Inventory_Scanner SHALL record its full path, filename, file size, and modification timestamp
|
|
3. WHERE ffprobe is available, THE Inventory_Scanner SHALL extract video metadata including resolution, codec, duration, and bitrate
|
|
4. WHEN scanning completes, THE Inventory_Scanner SHALL generate a structured inventory report in CSV format
|
|
5. THE Inventory_Scanner SHALL scan all top-level directories including movie, series, anime, and other
|
|
6. THE Inventory_Scanner SHALL perform read-only operations without modifying any files or directories
|
|
7. WHEN scanning encounters an inaccessible file or directory, THE Inventory_Scanner SHALL log the error and continue scanning remaining files
|
|
8. THE Inventory_Scanner SHALL save the inventory report to disk for later use
|
|
|
|
### 2. Identity Parsing for Movies
|
|
|
|
**User Story:** As a user, I want the system to extract movie titles and years from filenames, so that I can organize my movie collection into a predictable structure.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN a Video_File is located in the movie directory, THE Identity_Parser SHALL extract the movie title and release year from the filename
|
|
2. THE Identity_Parser SHALL handle common filename patterns including "Title (Year)", "Title.Year", "Title - Year", and variations with quality tags
|
|
3. WHEN a filename contains quality indicators (1080p, BluRay, WEB-DL), THE Identity_Parser SHALL exclude them from the title
|
|
4. WHEN a filename contains release group tags in brackets or parentheses, THE Identity_Parser SHALL exclude them from the title
|
|
5. WHEN the Identity_Parser cannot confidently extract a year, THE Identity_Parser SHALL mark the movie as requiring manual review
|
|
6. THE Identity_Parser SHALL normalize titles by removing extra whitespace and standardizing capitalization
|
|
7. WHEN multiple Video_Files share the same title and year, THE Identity_Parser SHALL flag them as potential duplicates
|
|
|
|
### 3. Identity Parsing for Series
|
|
|
|
**User Story:** As a user, I want the system to extract series titles, season numbers, and episode numbers from filenames, so that I can organize my TV series into a consistent structure.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN a Video_File is located in the series directory, THE Identity_Parser SHALL extract the series title, season number, and episode number from the filename
|
|
2. THE Identity_Parser SHALL recognize common episode patterns including "SXXEYY", "SXXeYY", "SeasonXEpisodeY", and "XXxYY"
|
|
3. THE Identity_Parser SHALL handle multi-episode files by extracting all episode numbers (e.g., "S01E01-E02")
|
|
4. WHEN a filename contains quality indicators or release group tags, THE Identity_Parser SHALL exclude them from the series title
|
|
5. WHEN the Identity_Parser cannot confidently extract season or episode numbers, THE Identity_Parser SHALL mark the file as requiring manual review
|
|
6. THE Identity_Parser SHALL normalize series titles by removing extra whitespace and standardizing capitalization
|
|
7. WHEN parsing completes, THE Identity_Parser SHALL group episodes by series title and season number
|
|
|
|
### 4. Series Completeness Analysis
|
|
|
|
**User Story:** As a user, I want to identify series with episode gaps in my collection, so that I can understand which series have missing episodes.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN analyzing a series, THE Analysis_Engine SHALL detect gaps in episode sequences within each season using heuristic detection
|
|
2. WHEN a season has episodes numbered 1, 2, 4, 5, THE Analysis_Engine SHALL report episode 3 as missing (gap in range [1, 5])
|
|
3. THE Analysis_Engine SHALL NOT calculate completeness percentages or determine if seasons are "complete" (v1 limitation: no external metadata)
|
|
4. WHEN a series has multiple seasons, THE Analysis_Engine SHALL analyze each season independently
|
|
5. THE Analysis_Engine SHALL generate a completeness report listing all series with detected episode gaps
|
|
6. THE completeness report SHALL show episodes_found and episodes_missing (gaps in [min, max]) for each season
|
|
|
|
### 5. Duplicate Detection
|
|
|
|
**User Story:** As a user, I want to identify duplicate or redundant video files, so that I can remove unnecessary copies and save storage space.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN multiple Video_Files have identical titles and years (for movies), THE Analysis_Engine SHALL flag them as potential duplicates
|
|
2. WHEN multiple Video_Files have identical series titles, season numbers, and episode numbers, THE Analysis_Engine SHALL flag them as potential duplicates
|
|
3. WHERE file size metadata is available, THE Analysis_Engine SHALL compare file sizes to help identify quality differences
|
|
4. WHERE video metadata is available, THE Analysis_Engine SHALL compare resolution and codec to help identify quality differences
|
|
5. THE Analysis_Engine SHALL generate a duplicate report grouping all potential duplicates with their metadata
|
|
6. THE Analysis_Engine SHALL provide comparison data without automatically recommending which file to keep
|
|
|
|
### 6. Execution Plan Generation
|
|
|
|
**User Story:** As a user, I want to review a detailed plan of all file operations before they are executed, so that I can verify the changes are correct and safe.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN the user requests organization, THE Plan_Generator SHALL create an Execution_Plan containing all proposed file operations
|
|
2. THE Execution_Plan SHALL specify operation type (rename, move, quarantine, no-op) for each Video_File
|
|
3. WHEN a movie should be organized, THE Execution_Plan SHALL specify moving it to "movie/Title (Year)/" directory structure
|
|
4. WHEN a series episode should be organized, THE Execution_Plan SHALL specify moving it to "series/Title/Season XX/" directory structure with "SXXEYY.ext" filename
|
|
5. THE Execution_Plan SHALL preserve the original top-level directory structure (movie, series, anime, other)
|
|
6. THE Execution_Plan SHALL include source path, destination path, and operation type for each file
|
|
7. THE Plan_Generator SHALL output the Execution_Plan in JSON format for both human readability and machine processing
|
|
8. WHEN generating plans, THE Plan_Generator SHALL detect potential conflicts (destination file already exists) and mark them for user review
|
|
9. THE Execution_Plan SHALL be editable by the user before execution
|
|
|
|
### 7. Safe File Operations
|
|
|
|
**User Story:** As a user, I want all file operations to be executed safely with dry-run support and explicit confirmation, so that I can prevent accidental data loss.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. THE Execution_Engine SHALL support Dry_Run_Mode that simulates operations without making changes
|
|
2. WHEN executing in Dry_Run_Mode, THE Execution_Engine SHALL log all operations that would be performed
|
|
3. WHEN executing file operations, THE Execution_Engine SHALL require explicit user confirmation before proceeding
|
|
4. WHEN moving or renaming files, THE Execution_Engine SHALL create destination directories if they do not exist
|
|
5. The Execution_Engine SHALL report the conflict and skip the affected operation without halting other planned operations.
|
|
6. THE Execution_Engine SHALL log all file operations with timestamps, source paths, destination paths, and operation results
|
|
7. WHEN any operation fails, THE Execution_Engine SHALL log the error and continue with remaining operations
|
|
8. THE Execution_Engine SHALL generate an execution summary showing successful operations, failed operations, and skipped operations
|
|
|
|
### 8. Quarantine Operations
|
|
|
|
**User Story:** As a user, I want to safely isolate unwanted files in a quarantine directory, so that I can review them before permanent deletion.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN the user marks files for quarantine, THE Execution_Engine SHALL move them to a Quarantine_Directory within the library root
|
|
2. THE Quarantine_Directory SHALL be located at `<library_root>/.quarantine/`
|
|
3. THE Execution_Engine SHALL preserve the relative directory structure within the Quarantine_Directory
|
|
4. WHEN moving files to quarantine, THE Execution_Engine SHALL record the original location in a quarantine manifest file
|
|
5. THE quarantine manifest SHALL be stored as JSON and include original path, quarantine path, timestamp, and optional reason
|
|
6. WHEN a quarantined file already exists at the destination, THE Execution_Engine SHALL append a numeric suffix to avoid overwriting
|
|
7. THE Execution_Engine SHALL support listing all quarantined files with their original locations
|
|
8. THE Execution_Engine SHALL prevent permanent deletion of files in v1
|
|
|
|
### 9. Rollback Operations
|
|
|
|
**User Story:** As a user, I want to undo file operations and restore files to their original locations, so that I can recover from mistakes.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN file operations are executed, THE Execution_Engine SHALL create a Rollback_Log containing all operations performed
|
|
2. THE Rollback_Log SHALL include operation type, source path, destination path, and timestamp for each operation
|
|
3. WHEN the user initiates a rollback, THE Execution_Engine SHALL restore files to their original locations based on the Rollback_Log
|
|
4. WHEN rolling back quarantine operations, THE Execution_Engine SHALL move files from Quarantine_Directory back to their original locations
|
|
5. WHEN rolling back move operations, THE Execution_Engine SHALL move files from destination back to source
|
|
6. WHEN rolling back rename operations, THE Execution_Engine SHALL rename files back to their original names
|
|
7. IF a rollback operation fails, THE Execution_Engine SHALL log the error and continue with remaining rollback operations
|
|
8. THE Execution_Engine SHALL generate a rollback summary showing successful rollbacks, failed rollbacks, and skipped operations
|
|
|
|
### 10. Configuration Management
|
|
|
|
**User Story:** As a user, I want to configure parsing rules, directory templates, and policies, so that I can customize the tool to my preferences.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. THE Video_Library_Manager SHALL load configuration from a Configuration_File
|
|
2. THE Configuration_File SHALL specify video file extensions to recognize
|
|
3. THE Configuration_File SHALL specify directory templates for movies and series
|
|
4. THE Configuration_File SHALL specify the library root path
|
|
5. Parsing patterns for movie titles and series episodes are hardcoded in v1 (not user-configurable)
|
|
6. WHEN the Configuration_File is missing, THE Video_Library_Manager SHALL create a default Configuration_File
|
|
7. WHEN the Configuration_File contains invalid syntax, THE Video_Library_Manager SHALL report the error and use default values
|
|
8. THE Video_Library_Manager SHALL validate configuration values and report errors for invalid settings
|
|
|
|
### 11. Reporting and Visualization
|
|
|
|
**User Story:** As a user, I want to view comprehensive reports about my video library, so that I can understand its current state and make informed decisions.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. THE Video_Library_Manager SHALL generate an inventory report listing all discovered Video_Files with metadata
|
|
2. THE Video_Library_Manager SHALL generate a completeness report showing incomplete series with missing episodes
|
|
3. THE Video_Library_Manager SHALL generate a duplicate report grouping potential duplicates with quality comparisons
|
|
4. THE Video_Library_Manager SHALL generate a summary report with total file count, total size, and category breakdown
|
|
5. THE Video_Library_Manager SHALL support exporting reports in CSV format for programmatic access
|
|
6. THE Video_Library_Manager SHALL support exporting reports in JSON format for programmatic access
|
|
7. THE Video_Library_Manager SHALL support exporting reports in human-readable text format
|
|
8. WHEN generating reports, THE Video_Library_Manager SHALL include generation timestamp and library root path
|
|
|
|
### 12. Anime Inventory Support
|
|
|
|
**User Story:** As a user, I want anime files to be included in inventory scans, so that I have a complete view of my library even though anime organization is deferred.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN scanning the anime directory, THE Inventory_Scanner SHALL discover and catalog all Video_Files
|
|
2. THE Inventory_Scanner SHALL record the same metadata for anime files as for other video files
|
|
3. THE Identity_Parser SHALL skip parsing logic for anime files in v1
|
|
4. THE Analysis_Engine SHALL skip completeness and duplicate analysis for anime files in v1
|
|
5. THE Plan_Generator SHALL not generate organization plans for anime files in v1
|
|
6. THE Video_Library_Manager SHALL include anime files in inventory reports with a flag indicating deferred processing
|
|
7. THE Video_Library_Manager SHALL preserve the anime directory structure without modifications
|
|
|
|
### 13. Error Handling and Logging
|
|
|
|
**User Story:** As a user, I want comprehensive error handling and logging, so that I can troubleshoot issues and understand what the tool is doing.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. WHEN any operation encounters an error, THE Video_Library_Manager SHALL log the error with timestamp, operation type, and error details
|
|
2. THE Video_Library_Manager SHALL continue processing remaining operations after encountering non-fatal errors
|
|
3. WHEN encountering file system errors (permission denied, file not found), THE Video_Library_Manager SHALL log the error and skip the affected file
|
|
4. WHEN encountering parsing errors, THE Video_Library_Manager SHALL log the error and mark the file for manual review
|
|
5. THE Video_Library_Manager SHALL support configurable log levels (DEBUG, INFO, WARNING, ERROR)
|
|
6. THE Video_Library_Manager SHALL write logs to both console output and a log file
|
|
7. WHEN the log file exceeds 10MB, THE Video_Library_Manager SHALL rotate the log file
|
|
|
|
### 14. Command-Line Interface
|
|
|
|
**User Story:** As a user, I want a clear command-line interface to interact with the tool, so that I can easily perform all operations. In v1, the CLI SHALL expose only the minimal commands required to complete the end-to-end workflow. Other commands may exist internally but are not required to be user-facing.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
1. THE Video_Library_Manager SHALL provide a command-line interface with subcommands for each major operation
|
|
2. THE Video_Library_Manager SHALL support a "scan" command to perform inventory scanning
|
|
3. THE Video_Library_Manager SHALL support a "parse" command to perform identity parsing
|
|
4. THE Video_Library_Manager SHALL support an "analyze" command to perform completeness and duplicate analysis
|
|
5. THE Video_Library_Manager SHALL support a "plan" command to generate execution plans
|
|
6. THE Video_Library_Manager SHALL support an "execute" command to execute plans with dry-run and confirmation options
|
|
7. THE Video_Library_Manager SHALL support a "quarantine" command to manage quarantined files
|
|
8. THE Video_Library_Manager SHALL support a "rollback" command to undo operations
|
|
9. THE Video_Library_Manager SHALL support a "report" command to generate and export reports
|
|
|
|
10. THE Video_Library_Manager SHALL display help text for each command with usage examples
|
|
11. WHEN the user provides invalid arguments, THE Video_Library_Manager SHALL display an error message and usage help
|