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
This commit is contained in:
commit
51679d1943
254 changed files with 37281 additions and 0 deletions
110
backend/playlist/serializers_download.py
Normal file
110
backend/playlist/serializers_download.py
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
"""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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue