Refactor downloads to use job-specific subdirectories

Organize downloaded files into per-job subdirectories under "downloads" instead of a flat structure. Update DownloadController and VideoService to read, write, and delete files within these job-specific directories. Add helper methods for directory management and improve logging. Update download/delete endpoints and result URLs to reflect the new structure. Clean up empty job directories after file deletion.
This commit is contained in:
Michal Vrba
2025-12-14 11:04:46 +01:00
parent 7c99721174
commit 2d2e855202
14 changed files with 1073 additions and 66 deletions
+161
View File
@@ -0,0 +1,161 @@
# Session Management Implementation
This document describes the session management feature implemented for TuneRipper to organize MP3 files by user sessions.
## Overview
The session management system automatically creates and manages user sessions to organize downloaded files in separate directories. Each session gets its own subdirectory under the downloads folder.
## Key Features
1. **Automatic Session Creation**: When the app starts, it creates or retrieves an existing session ID
2. **Session-Based File Organization**: All MP3 files are stored in `/downloads/{sessionId}/` directories
3. **Session Persistence**: Session IDs are stored in browser's localStorage
4. **Session Validation**: Server validates session IDs and handles expired sessions
5. **Backward Compatibility**: Legacy endpoints still work for existing files
## Architecture Changes
### Server-Side (TuneRipper.Api)
#### New Services
- **`ISessionService`**: Interface for session management operations
- **`SessionService`**: Implementation handling session creation, validation, and cleanup
- Creates unique 16-character session IDs
- Manages session directories under `/downloads/{sessionId}/`
- Automatic cleanup of expired sessions (24-hour timeout)
- Background timer for periodic cleanup
#### Updated Controllers
- **`VideoController`**: Now accepts and manages session IDs in processing requests
- **`DownloadController`**: Enhanced with session-aware endpoints
- **`SessionController`**: New controller for session CRUD operations
#### New Endpoints
```
POST /api/session/create - Create new session
GET /api/session/validate/{sessionId} - Validate existing session
POST /api/session/refresh/{sessionId} - Refresh session timeout
GET /api/download/{sessionId}/{jobId} - Session-aware file download
GET /api/download/info/{sessionId}/{jobId} - Session-aware file info
DELETE /api/download/{sessionId}/{jobId} - Session-aware file deletion
GET /api/video/jobs/{sessionId} - Get jobs for specific session
```
#### File Organization
```
downloads/
??? legacy_files.mp3 # Legacy files (root level)
??? {sessionId1}/ # Session 1 directory
? ??? {jobId}_video_title.mp3 # Session 1 files
? ??? {jobId}_video_title.mp3
??? {sessionId2}/ # Session 2 directory
??? {jobId}_video_title.mp3 # Session 2 files
??? {jobId}_video_title.mp3
```
### Client-Side (TuneRipper)
#### New Services
- **`IClientSessionService`**: Interface for client-side session management
- **`ClientSessionService`**: Implementation handling browser-side session storage
- Manages session ID in localStorage
- Validates sessions with server
- Automatic session creation when needed
#### Updated Components
- **`Home.razor`**: Enhanced to use session management
- Displays current session ID (truncated)
- Includes session ID in processing requests
- Constructs session-aware download URLs
#### Updated API Service
- **`TuneRipperApiService`**: Extended with session-aware methods
- Session creation and validation
- Session-aware file downloads
- Session-specific job queries
## Data Flow
1. **App Initialization**:
```
Client loads ? Check localStorage for sessionId ? Validate with server ? Create new if invalid
```
2. **Video Processing**:
```
User submits URL ? Include sessionId in request ? Server processes to session directory
```
3. **File Download**:
```
User clicks download ? Use session-aware URL ? Server serves from session directory
```
## Session Lifecycle
1. **Creation**: 16-character unique ID generated
2. **Storage**: Stored in browser localStorage and server memory
3. **Validation**: Checked on each request, 24-hour timeout
4. **Cleanup**: Automatic background cleanup of expired sessions
5. **Directory Management**: Session directories created/deleted as needed
## Backward Compatibility
- Legacy download endpoints still function
- Old files remain accessible through fallback logic
- Gradual migration as users create new sessions
## Configuration
### Session Settings
- **Timeout**: 24 hours (configurable in `SessionService`)
- **Cleanup Interval**: 1 hour (configurable in `SessionService`)
- **Directory Structure**: `/downloads/{sessionId}/`
### Environment Variables
No new environment variables required - uses existing web root path configuration.
## Security Considerations
- Session IDs are random and non-guessable
- Server validates all session operations
- Automatic cleanup prevents disk space accumulation
- No sensitive data stored in sessions
## Monitoring and Logging
- Session creation/validation logged
- File operations include session context
- Cleanup operations logged with statistics
- Error handling for session failures
## Future Enhancements
1. **Database Storage**: Replace in-memory session storage with persistent storage
2. **Session Sharing**: Allow sharing sessions between devices
3. **Session Analytics**: Track usage patterns and statistics
4. **Extended Metadata**: Store additional session information
5. **Admin Interface**: Management interface for session administration
## API Examples
### Create Session
```http
POST /api/session/create
Response: { "sessionId": "abc123def456", "message": "Session created successfully" }
```
### Process Video with Session
```http
POST /api/video/process
{ "url": "https://youtube.com/watch?v=...", "sessionId": "abc123def456", "format": "mp3" }
```
### Download File by Session
```http
GET /api/download/abc123def456/job-id-123
Response: Binary audio file
```