- Add Redis caching (2h TTL) to categories, collections, and pinned collections in video, library, article, podcast, and dobodbi_calendar (6h TTL)
- Implement conditional_cached_view (30m TTL) for list endpoints (books, podcasts, articles, videos, playlists) that caches public queries and bypasses caching when is_bookmark=true or is_bookmarked=true
- Remove bookmark/user count queries from pinned collection list views to avoid user-specific cache pollution
- Prevent user bookmark/rate leakage into public catalog cache in BookListView via AnonymousUser context wrapper
- Fix video bookmark filtering bug in VideoPlaylistListAPIView and VideoListAPIView to accept both is_bookmark and is_bookmarked, and query both VIDEO_PLAYLIST and VIDEO bookmarks
- Add assign_random_videos_to_playlists management command
- Eliminate N+1 queries in hadis serializers by using in-memory prefetch cache instead of .first() and .order_by()
- Add select_related for hadis and category in HadisSyncView prefetches
- Apply cached_view (Redis 2h + Accept-Language) to HadisSyncView and public hadis endpoints
- Enable GZipMiddleware in Django settings to compress large API responses
- Create reusable watermark utility in utils/watermark.py supporting PIL, UploadedFile, bytes, and DRF serializer fields
- Default position set to bottom-left with responsive 32% width scaling and alpha blending
- Auto-resolve SVG watermark to high-resolution PNG
- Integrate automatic watermarking into Article thumbnails, Hadith/Book Reference images, Corrections, Original Texts, and Interpretations
- auto-extract YouTube duration and thumbnail on Video save using yt-dlp
- filter out empty playlists and playlists with inactive items in video and podcast public/app views
- dynamically calculate number_of_volumes for BookEditionV2 based on assigned volumes
- Add is_root query param filter defaulting to true (parent__isnull=True) in CategoriesBySectView
- Ensure pagination count returns total count of root categories for the sect
- Add OptionalPagination to Dovodi Category and Collection viewsets (podcast, video, article)
- Support status query filtering (status=true/false) in category and collection viewsets
- Sort categories and collections by newest first (-created_at, -id) across podcast, video, article, and library admin viewsets
- Make slug optional in AdminArticle serializers with auto-generation fallback
- Support unicode and URL-encoded slugs with case-insensitive lookup in ArticleDetailAPIView
- Count only active books (status=True) in library Category.books_count and CategoryListView