111 lines
3.4 KiB
Python
111 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)
|