from rest_framework import serializers from .models import VideoCategory, Video, VideoCollection, VideoInCollection class VideoCategoryListSerializer(serializers.ModelSerializer): video_count = serializers.SerializerMethodField() class Meta: model = VideoCategory fields = ['id', 'title', 'slug', 'video_count'] def get_video_count(self, obj): return obj.videos.filter(status=True).count() class VideoListSerializer(serializers.ModelSerializer): categories = VideoCategoryListSerializer(many=True, read_only=True) class Meta: model = Video fields = ['id', 'title', 'slug', 'thumbnail', 'description', 'video_time', 'view_count', 'categories', 'created_at'] class VideoDetailSerializer(serializers.ModelSerializer): related_videos = serializers.SerializerMethodField() categories = VideoCategoryListSerializer(many=True, read_only=True) class Meta: model = Video fields = ['id', 'title', 'slug', 'thumbnail', 'description', 'video_type', 'video_file', 'video_url', 'video_time', 'view_count', 'categories', 'created_at', 'related_videos'] def get_related_videos(self, obj): # Get all collections that contain this video collections = obj.collections.all() if collections.exists(): # Get all videos from all collections that contain this video related_videos = [] video_ids = set() # To track unique videos for collection in collections: # Get all videos in this collection ordered by priority videos_in_collection = VideoInCollection.objects.filter( video_collection=collection ).exclude(video=obj).order_by('priority') # Add videos to our list if not already added for vic in videos_in_collection: if vic.video.id not in video_ids: related_videos.append(vic.video) video_ids.add(vic.video.id) # Return the related videos using VideoListSerializer return VideoListSerializer(related_videos, many=True).data # # If not in a collection, return videos from the same category # elif obj.category: # related = Video.objects.filter( # category=obj.category, # status=True # ).exclude(id=obj.id)[:5] # return VideoListSerializer(related, many=True).data return []