fix: support missing/no-episodes library filters (API, UI, docs, tests)

This commit is contained in:
2026-03-16 21:01:59 +01:00
parent e44a8190d0
commit 151a08e033
8 changed files with 227 additions and 99 deletions

View File

@@ -253,48 +253,92 @@ class AnimeSeriesService:
return list(result.scalars().all())
@staticmethod
async def get_series_with_no_episodes(
async def get_series_with_missing_episodes(
db: AsyncSession,
limit: Optional[int] = None,
offset: int = 0,
) -> List[AnimeSeries]:
"""Get anime series that have no episodes found in folder.
Since episodes in the database represent MISSING episodes
(from episodeDict), this returns series that have episodes
in the DB with is_downloaded=False, meaning they have missing
episodes and no files were found in the folder for those episodes.
Returns series where:
- At least one episode exists in database with is_downloaded=False
"""Get anime series that currently have missing episodes.
Episodes in the database represent missing episodes (from episodeDict).
This returns series that have at least one missing episode recorded in
the database (is_downloaded=False).
Args:
db: Database session
limit: Optional limit for results
offset: Offset for pagination
Returns:
List of AnimeSeries with missing episodes (not in folder)
List of AnimeSeries that have missing episodes.
"""
# Subquery to find series IDs with at least one undownloaded episode
undownloaded_series_ids = (
# Subquery to find series IDs with at least one missing episode
missing_series_ids = (
select(Episode.series_id)
.where(Episode.is_downloaded == False)
.distinct()
.subquery()
)
# Select series that have undownloaded episodes
query = (
select(AnimeSeries)
.where(AnimeSeries.id.in_(select(undownloaded_series_ids.c.series_id)))
.where(AnimeSeries.id.in_(select(missing_series_ids.c.series_id)))
.order_by(AnimeSeries.name)
.offset(offset)
)
if limit:
query = query.limit(limit)
result = await db.execute(query)
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.
A series has "no episodes" if it has at least one missing episode
(is_downloaded=False) and no downloaded episodes (is_downloaded=True).
Args:
db: Database session
limit: Optional limit for results
offset: Offset for pagination
Returns:
List of AnimeSeries where no episodes are downloaded.
"""
# Series with missing episodes
missing_series_ids = (
select(Episode.series_id)
.where(Episode.is_downloaded == False)
.distinct()
.subquery()
)
# Series with any downloaded episodes
downloaded_series_ids = (
select(Episode.series_id)
.where(Episode.is_downloaded == True)
.distinct()
.subquery()
)
query = (
select(AnimeSeries)
.where(AnimeSeries.id.in_(select(missing_series_ids.c.series_id)))
.where(~AnimeSeries.id.in_(select(downloaded_series_ids.c.series_id)))
.order_by(AnimeSeries.name)
.offset(offset)
)
if limit:
query = query.limit(limit)
result = await db.execute(query)
return list(result.scalars().all())