soundwave/backend/playlist/serializers_download.py
Iulian 51679d1943 Initial commit - SoundWave v1.0
- Full PWA support with offline capabilities
- Comprehensive search across songs, playlists, and channels
- Offline playlist manager with download tracking
- Pre-built frontend for zero-build deployment
- Docker-based deployment with docker compose
- Material-UI dark theme interface
- YouTube audio download and management
- Multi-user authentication support
2025-12-16 23:43:07 +00:00

110 lines
3.4 KiB
Python

"""Serializers for playlist download"""
from rest_framework import serializers
from playlist.models_download import PlaylistDownload, PlaylistDownloadItem
from playlist.serializers import PlaylistSerializer
class PlaylistDownloadItemSerializer(serializers.ModelSerializer):
"""Serializer for playlist download items"""
audio_title = serializers.CharField(source='audio.title', read_only=True)
audio_duration = serializers.IntegerField(source='audio.duration', read_only=True)
progress_percent = serializers.FloatField(read_only=True)
class Meta:
model = PlaylistDownloadItem
fields = [
'id',
'audio',
'audio_title',
'audio_duration',
'status',
'position',
'file_size_bytes',
'downloaded_bytes',
'progress_percent',
'started_at',
'completed_at',
'error_message',
'retry_count',
]
read_only_fields = [
'id',
'status',
'file_size_bytes',
'downloaded_bytes',
'started_at',
'completed_at',
'error_message',
'retry_count',
]
class PlaylistDownloadSerializer(serializers.ModelSerializer):
"""Serializer for playlist downloads"""
playlist_data = PlaylistSerializer(source='playlist', read_only=True)
progress_percent = serializers.FloatField(read_only=True)
is_complete = serializers.BooleanField(read_only=True)
can_resume = serializers.BooleanField(read_only=True)
items = PlaylistDownloadItemSerializer(many=True, read_only=True)
class Meta:
model = PlaylistDownload
fields = [
'id',
'playlist',
'playlist_data',
'status',
'total_items',
'downloaded_items',
'failed_items',
'progress_percent',
'total_size_bytes',
'downloaded_size_bytes',
'quality',
'created_at',
'started_at',
'completed_at',
'error_message',
'download_path',
'is_complete',
'can_resume',
'items',
]
read_only_fields = [
'id',
'status',
'total_items',
'downloaded_items',
'failed_items',
'total_size_bytes',
'downloaded_size_bytes',
'created_at',
'started_at',
'completed_at',
'error_message',
'download_path',
]
class PlaylistDownloadCreateSerializer(serializers.ModelSerializer):
"""Serializer for creating playlist download"""
class Meta:
model = PlaylistDownload
fields = ['playlist', 'quality']
def validate_playlist(self, value):
"""Validate user owns the playlist"""
request = self.context.get('request')
if request and hasattr(value, 'owner'):
if value.owner != request.user:
raise serializers.ValidationError("You can only download your own playlists")
return value
def create(self, validated_data):
"""Set user from request"""
request = self.context.get('request')
if request and request.user.is_authenticated:
validated_data['user'] = request.user
return super().create(validated_data)