Fix NFO database query errors
- Fixed async context manager issue in anime.py (use get_sync_session) - Fixed async methods in anime_service.py to use async with - Fixed folder_name attribute error (should be folder) - All three methods now properly handle database sessions
This commit is contained in:
@@ -318,27 +318,30 @@ async def list_anime(
|
||||
nfo_map = {}
|
||||
try:
|
||||
# Get all series from database to fetch NFO metadata
|
||||
from src.server.database.connection import get_db_session
|
||||
session = get_db_session()
|
||||
from src.server.database.connection import get_sync_session
|
||||
from src.server.database.models import AnimeSeries as DBAnimeSeries
|
||||
|
||||
db_series_list = session.query(DBAnimeSeries).all()
|
||||
for db_series in db_series_list:
|
||||
nfo_created = (
|
||||
db_series.nfo_created_at.isoformat()
|
||||
if db_series.nfo_created_at else None
|
||||
)
|
||||
nfo_updated = (
|
||||
db_series.nfo_updated_at.isoformat()
|
||||
if db_series.nfo_updated_at else None
|
||||
)
|
||||
nfo_map[db_series.folder_name] = {
|
||||
"has_nfo": db_series.has_nfo or False,
|
||||
"nfo_created_at": nfo_created,
|
||||
"nfo_updated_at": nfo_updated,
|
||||
"tmdb_id": db_series.tmdb_id,
|
||||
"tvdb_id": db_series.tvdb_id,
|
||||
}
|
||||
session = get_sync_session()
|
||||
try:
|
||||
db_series_list = session.query(DBAnimeSeries).all()
|
||||
for db_series in db_series_list:
|
||||
nfo_created = (
|
||||
db_series.nfo_created_at.isoformat()
|
||||
if db_series.nfo_created_at else None
|
||||
)
|
||||
nfo_updated = (
|
||||
db_series.nfo_updated_at.isoformat()
|
||||
if db_series.nfo_updated_at else None
|
||||
)
|
||||
nfo_map[db_series.folder] = {
|
||||
"has_nfo": db_series.has_nfo or False,
|
||||
"nfo_created_at": nfo_created,
|
||||
"nfo_updated_at": nfo_updated,
|
||||
"tmdb_id": db_series.tmdb_id,
|
||||
"tvdb_id": db_series.tvdb_id,
|
||||
}
|
||||
finally:
|
||||
session.close()
|
||||
except Exception as e:
|
||||
logger.warning(f"Could not fetch NFO data from database: {e}")
|
||||
# Continue without NFO data if database query fails
|
||||
|
||||
@@ -885,21 +885,57 @@ class AnimeService:
|
||||
"""
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
from src.server.database.connection import get_db_session
|
||||
from src.server.database.models import AnimeSeries
|
||||
|
||||
try:
|
||||
# Get or create database session
|
||||
should_close = False
|
||||
if db is None:
|
||||
db = get_db_session()
|
||||
should_close = True
|
||||
|
||||
try:
|
||||
# Find series by key
|
||||
series = db.query(AnimeSeries).filter(
|
||||
AnimeSeries.key == key
|
||||
).first()
|
||||
async with get_db_session() as db:
|
||||
# Find series by key
|
||||
result = await db.execute(
|
||||
select(AnimeSeries).filter(AnimeSeries.key == key)
|
||||
)
|
||||
series = result.scalars().first()
|
||||
|
||||
if not series:
|
||||
logger.warning(
|
||||
"Series not found in database for NFO update",
|
||||
key=key
|
||||
)
|
||||
return
|
||||
|
||||
# Update NFO fields
|
||||
now = datetime.now(timezone.utc)
|
||||
series.has_nfo = has_nfo
|
||||
|
||||
if has_nfo:
|
||||
if series.nfo_created_at is None:
|
||||
series.nfo_created_at = now
|
||||
series.nfo_updated_at = now
|
||||
|
||||
if tmdb_id is not None:
|
||||
series.tmdb_id = tmdb_id
|
||||
|
||||
if tvdb_id is not None:
|
||||
series.tvdb_id = tvdb_id
|
||||
|
||||
await db.commit()
|
||||
logger.info(
|
||||
"Updated NFO status in database",
|
||||
key=key,
|
||||
has_nfo=has_nfo,
|
||||
tmdb_id=tmdb_id,
|
||||
tvdb_id=tvdb_id
|
||||
)
|
||||
else:
|
||||
# Use provided session
|
||||
result = await db.execute(
|
||||
select(AnimeSeries).filter(AnimeSeries.key == key)
|
||||
)
|
||||
series = result.scalars().first()
|
||||
|
||||
if not series:
|
||||
logger.warning(
|
||||
@@ -923,7 +959,7 @@ class AnimeService:
|
||||
if tvdb_id is not None:
|
||||
series.tvdb_id = tvdb_id
|
||||
|
||||
db.commit()
|
||||
await db.commit()
|
||||
logger.info(
|
||||
"Updated NFO status in database",
|
||||
key=key,
|
||||
@@ -931,10 +967,6 @@ class AnimeService:
|
||||
tmdb_id=tmdb_id,
|
||||
tvdb_id=tvdb_id
|
||||
)
|
||||
|
||||
finally:
|
||||
if should_close:
|
||||
db.close()
|
||||
|
||||
except Exception as exc:
|
||||
logger.exception(
|
||||
@@ -962,21 +994,45 @@ class AnimeService:
|
||||
Raises:
|
||||
AnimeServiceError: If query fails
|
||||
"""
|
||||
from sqlalchemy import select
|
||||
|
||||
from src.server.database.connection import get_db_session
|
||||
from src.server.database.models import AnimeSeries
|
||||
|
||||
try:
|
||||
# Get or create database session
|
||||
should_close = False
|
||||
if db is None:
|
||||
db = get_db_session()
|
||||
should_close = True
|
||||
|
||||
try:
|
||||
# Query series without NFO
|
||||
series_list = db.query(AnimeSeries).filter(
|
||||
AnimeSeries.has_nfo == False # noqa: E712
|
||||
).all()
|
||||
async with get_db_session() as db:
|
||||
# Query series without NFO
|
||||
result_obj = await db.execute(
|
||||
select(AnimeSeries).filter(AnimeSeries.has_nfo == False) # noqa: E712
|
||||
)
|
||||
series_list = result_obj.scalars().all()
|
||||
|
||||
result = []
|
||||
for series in series_list:
|
||||
result.append({
|
||||
"key": series.key,
|
||||
"name": series.name,
|
||||
"folder": series.folder,
|
||||
"has_nfo": False,
|
||||
"tmdb_id": series.tmdb_id,
|
||||
"tvdb_id": series.tvdb_id,
|
||||
"nfo_created_at": None,
|
||||
"nfo_updated_at": None
|
||||
})
|
||||
|
||||
logger.info(
|
||||
"Retrieved series without NFO",
|
||||
count=len(result)
|
||||
)
|
||||
return result
|
||||
else:
|
||||
# Use provided session
|
||||
result_obj = await db.execute(
|
||||
select(AnimeSeries).filter(AnimeSeries.has_nfo == False) # noqa: E712
|
||||
)
|
||||
series_list = result_obj.scalars().all()
|
||||
|
||||
result = []
|
||||
for series in series_list:
|
||||
@@ -996,10 +1052,6 @@ class AnimeService:
|
||||
count=len(result)
|
||||
)
|
||||
return result
|
||||
|
||||
finally:
|
||||
if should_close:
|
||||
db.close()
|
||||
|
||||
except Exception as exc:
|
||||
logger.exception("Failed to query series without NFO")
|
||||
@@ -1024,34 +1076,70 @@ class AnimeService:
|
||||
Raises:
|
||||
AnimeServiceError: If query fails
|
||||
"""
|
||||
from sqlalchemy import func, select
|
||||
|
||||
from src.server.database.connection import get_db_session
|
||||
from src.server.database.models import AnimeSeries
|
||||
|
||||
try:
|
||||
# Get or create database session
|
||||
should_close = False
|
||||
if db is None:
|
||||
db = get_db_session()
|
||||
should_close = True
|
||||
|
||||
try:
|
||||
async with get_db_session() as db:
|
||||
# Count total series
|
||||
total_result = await db.execute(select(func.count()).select_from(AnimeSeries))
|
||||
total = total_result.scalar()
|
||||
|
||||
# Count series with NFO
|
||||
with_nfo_result = await db.execute(
|
||||
select(func.count()).select_from(AnimeSeries).filter(AnimeSeries.has_nfo == True) # noqa: E712
|
||||
)
|
||||
with_nfo = with_nfo_result.scalar()
|
||||
|
||||
# Count series with TMDB ID
|
||||
with_tmdb_result = await db.execute(
|
||||
select(func.count()).select_from(AnimeSeries).filter(AnimeSeries.tmdb_id.isnot(None))
|
||||
)
|
||||
with_tmdb = with_tmdb_result.scalar()
|
||||
|
||||
# Count series with TVDB ID
|
||||
with_tvdb_result = await db.execute(
|
||||
select(func.count()).select_from(AnimeSeries).filter(AnimeSeries.tvdb_id.isnot(None))
|
||||
)
|
||||
with_tvdb = with_tvdb_result.scalar()
|
||||
|
||||
stats = {
|
||||
"total": total,
|
||||
"with_nfo": with_nfo,
|
||||
"without_nfo": total - with_nfo,
|
||||
"with_tmdb_id": with_tmdb,
|
||||
"with_tvdb_id": with_tvdb
|
||||
}
|
||||
|
||||
logger.info("Retrieved NFO statistics", **stats)
|
||||
return stats
|
||||
else:
|
||||
# Use provided session
|
||||
# Count total series
|
||||
total = db.query(AnimeSeries).count()
|
||||
total_result = await db.execute(select(func.count()).select_from(AnimeSeries))
|
||||
total = total_result.scalar()
|
||||
|
||||
# Count series with NFO
|
||||
with_nfo = db.query(AnimeSeries).filter(
|
||||
AnimeSeries.has_nfo == True # noqa: E712
|
||||
).count()
|
||||
with_nfo_result = await db.execute(
|
||||
select(func.count()).select_from(AnimeSeries).filter(AnimeSeries.has_nfo == True) # noqa: E712
|
||||
)
|
||||
with_nfo = with_nfo_result.scalar()
|
||||
|
||||
# Count series with TMDB ID
|
||||
with_tmdb = db.query(AnimeSeries).filter(
|
||||
AnimeSeries.tmdb_id.isnot(None)
|
||||
).count()
|
||||
with_tmdb_result = await db.execute(
|
||||
select(func.count()).select_from(AnimeSeries).filter(AnimeSeries.tmdb_id.isnot(None))
|
||||
)
|
||||
with_tmdb = with_tmdb_result.scalar()
|
||||
|
||||
# Count series with TVDB ID
|
||||
with_tvdb = db.query(AnimeSeries).filter(
|
||||
AnimeSeries.tvdb_id.isnot(None)
|
||||
).count()
|
||||
with_tvdb_result = await db.execute(
|
||||
select(func.count()).select_from(AnimeSeries).filter(AnimeSeries.tvdb_id.isnot(None))
|
||||
)
|
||||
with_tvdb = with_tvdb_result.scalar()
|
||||
|
||||
stats = {
|
||||
"total": total,
|
||||
@@ -1063,10 +1151,6 @@ class AnimeService:
|
||||
|
||||
logger.info("Retrieved NFO statistics", **stats)
|
||||
return stats
|
||||
|
||||
finally:
|
||||
if should_close:
|
||||
db.close()
|
||||
|
||||
except Exception as exc:
|
||||
logger.exception("Failed to get NFO statistics")
|
||||
|
||||
Reference in New Issue
Block a user