Add filter for series with no downloaded episodes
- Added get_series_with_no_episodes() method to AnimeSeriesService - Updated list_anime endpoint to support filter='no_episodes' parameter - Added comprehensive unit tests for the new filtering functionality - All tests passing successfully
This commit is contained in:
@@ -251,6 +251,59 @@ class AnimeSeriesService:
|
||||
.limit(limit)
|
||||
)
|
||||
return list(result.scalars().all())
|
||||
|
||||
@staticmethod
|
||||
async def get_series_with_no_episodes(
|
||||
db: AsyncSession,
|
||||
limit: Optional[int] = None,
|
||||
offset: int = 0,
|
||||
) -> List[AnimeSeries]:
|
||||
"""Get anime series that have no downloaded episodes in folder.
|
||||
|
||||
Returns series where either:
|
||||
- No episodes exist in the database, OR
|
||||
- All episodes have is_downloaded=False
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
limit: Optional limit for results
|
||||
offset: Offset for pagination
|
||||
|
||||
Returns:
|
||||
List of AnimeSeries instances with no downloaded episodes
|
||||
"""
|
||||
from sqlalchemy import func, or_
|
||||
|
||||
# Subquery to count downloaded episodes per series
|
||||
downloaded_count = (
|
||||
select(
|
||||
Episode.series_id,
|
||||
func.count(Episode.id).label('downloaded_count')
|
||||
)
|
||||
.where(Episode.is_downloaded.is_(True))
|
||||
.group_by(Episode.series_id)
|
||||
.subquery()
|
||||
)
|
||||
|
||||
# Select series that either have no episodes or no downloaded episodes
|
||||
query = (
|
||||
select(AnimeSeries)
|
||||
.outerjoin(downloaded_count, AnimeSeries.id == downloaded_count.c.series_id)
|
||||
.where(
|
||||
or_(
|
||||
downloaded_count.c.downloaded_count == None,
|
||||
downloaded_count.c.downloaded_count == 0
|
||||
)
|
||||
)
|
||||
.order_by(AnimeSeries.name)
|
||||
.offset(offset)
|
||||
)
|
||||
|
||||
if limit:
|
||||
query = query.limit(limit)
|
||||
|
||||
result = await db.execute(query)
|
||||
return list(result.scalars().all())
|
||||
|
||||
|
||||
# ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user