refactor: remove legacy data file sync functionality
Series now loaded directly from database. Removed: - sync_legacy_series_to_db() from anime_service.py - Corresponding sync call after directory update in config.py - Safety nets in initialization_service.py for missing progress IDs
This commit is contained in:
@@ -279,30 +279,15 @@ async def update_directory(
|
|||||||
|
|
||||||
config_service.save_config(app_config)
|
config_service.save_config(app_config)
|
||||||
|
|
||||||
# Sync series from data files to database
|
# Series are now loaded directly from database, no sync needed
|
||||||
sync_count = 0
|
logger.info(
|
||||||
try:
|
"Directory updated successfully",
|
||||||
import structlog
|
directory=directory
|
||||||
|
)
|
||||||
from src.server.services.anime_service import sync_legacy_series_to_db
|
|
||||||
logger = structlog.get_logger(__name__)
|
|
||||||
sync_count = await sync_legacy_series_to_db(directory, logger)
|
|
||||||
logger.info(
|
|
||||||
"Directory updated: synced series from data files",
|
|
||||||
directory=directory,
|
|
||||||
count=sync_count
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
# Log but don't fail the directory update if sync fails
|
|
||||||
import structlog
|
|
||||||
structlog.get_logger(__name__).warning(
|
|
||||||
"Failed to sync series after directory update",
|
|
||||||
error=str(e)
|
|
||||||
)
|
|
||||||
|
|
||||||
response: Dict[str, Any] = {
|
response: Dict[str, Any] = {
|
||||||
"message": "Anime directory updated successfully",
|
"message": "Anime directory updated successfully",
|
||||||
"synced_series": sync_count
|
"synced_series": 0
|
||||||
}
|
}
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|||||||
@@ -1618,139 +1618,3 @@ class AnimeService:
|
|||||||
def get_anime_service(series_app: SeriesApp) -> AnimeService:
|
def get_anime_service(series_app: SeriesApp) -> AnimeService:
|
||||||
"""Factory used for creating AnimeService with a SeriesApp instance."""
|
"""Factory used for creating AnimeService with a SeriesApp instance."""
|
||||||
return AnimeService(series_app)
|
return AnimeService(series_app)
|
||||||
|
|
||||||
|
|
||||||
async def sync_legacy_series_to_db(
|
|
||||||
anime_directory: str,
|
|
||||||
log_instance=None # pylint: disable=unused-argument
|
|
||||||
) -> int:
|
|
||||||
"""
|
|
||||||
One-time legacy sync: import any series from 'data' files
|
|
||||||
not already in the database.
|
|
||||||
|
|
||||||
Deprecated: Series are now loaded directly from the database.
|
|
||||||
This function remains for backwards compatibility with legacy
|
|
||||||
file-based data during migration.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
anime_directory: Path to the anime directory with data files
|
|
||||||
log_instance: Optional logger instance (unused, kept for API
|
|
||||||
compatibility). This function always uses structlog internally.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Number of new series added to the database
|
|
||||||
"""
|
|
||||||
# Always use structlog for structured logging with keyword arguments
|
|
||||||
log = structlog.get_logger(__name__)
|
|
||||||
|
|
||||||
log.warning(
|
|
||||||
"sync_legacy_series_to_db is deprecated. "
|
|
||||||
"Series are now loaded directly from database."
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
|
||||||
from src.server.database.connection import get_db_session
|
|
||||||
from src.server.database.service import AnimeSeriesService, EpisodeService
|
|
||||||
|
|
||||||
log.info(
|
|
||||||
"Starting data file to database sync",
|
|
||||||
directory=anime_directory
|
|
||||||
)
|
|
||||||
|
|
||||||
# Get all series from data files using SeriesApp
|
|
||||||
series_app = SeriesApp(anime_directory)
|
|
||||||
all_series = await asyncio.to_thread(
|
|
||||||
series_app.get_all_series_from_data_files
|
|
||||||
)
|
|
||||||
|
|
||||||
if not all_series:
|
|
||||||
log.info("No series found in data files to sync")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
log.info(
|
|
||||||
"Found series in data files, syncing to database",
|
|
||||||
count=len(all_series)
|
|
||||||
)
|
|
||||||
|
|
||||||
async with get_db_session() as db:
|
|
||||||
added_count = 0
|
|
||||||
skipped_count = 0
|
|
||||||
for serie in all_series:
|
|
||||||
# Handle series with empty name - use folder as fallback
|
|
||||||
if not serie.name or not serie.name.strip():
|
|
||||||
if serie.folder and serie.folder.strip():
|
|
||||||
serie.name = serie.folder.strip()
|
|
||||||
log.debug(
|
|
||||||
"Using folder as name fallback",
|
|
||||||
key=serie.key,
|
|
||||||
folder=serie.folder
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
log.warning(
|
|
||||||
"Skipping series with empty name and folder",
|
|
||||||
key=serie.key
|
|
||||||
)
|
|
||||||
skipped_count += 1
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Check if series already exists in DB
|
|
||||||
existing = await AnimeSeriesService.get_by_key(db, serie.key)
|
|
||||||
if existing:
|
|
||||||
log.debug(
|
|
||||||
"Series already exists in database",
|
|
||||||
name=serie.name,
|
|
||||||
key=serie.key
|
|
||||||
)
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Create new series in database
|
|
||||||
anime_series = await AnimeSeriesService.create(
|
|
||||||
db=db,
|
|
||||||
key=serie.key,
|
|
||||||
name=serie.name,
|
|
||||||
site=serie.site,
|
|
||||||
folder=serie.folder,
|
|
||||||
year=serie.year if hasattr(serie, 'year') else None,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create Episode records for each episode in episodeDict
|
|
||||||
if serie.episodeDict:
|
|
||||||
for season, episode_numbers in serie.episodeDict.items():
|
|
||||||
for episode_number in episode_numbers:
|
|
||||||
await EpisodeService.create(
|
|
||||||
db=db,
|
|
||||||
series_id=anime_series.id,
|
|
||||||
season=season,
|
|
||||||
episode_number=episode_number,
|
|
||||||
)
|
|
||||||
|
|
||||||
added_count += 1
|
|
||||||
log.debug(
|
|
||||||
"Added series to database",
|
|
||||||
name=serie.name,
|
|
||||||
key=serie.key
|
|
||||||
)
|
|
||||||
except Exception as e: # pylint: disable=broad-except
|
|
||||||
log.warning(
|
|
||||||
"Failed to add series to database",
|
|
||||||
key=serie.key,
|
|
||||||
name=serie.name,
|
|
||||||
error=str(e)
|
|
||||||
)
|
|
||||||
skipped_count += 1
|
|
||||||
|
|
||||||
log.info(
|
|
||||||
"Data file sync complete",
|
|
||||||
added=added_count,
|
|
||||||
skipped=len(all_series) - added_count
|
|
||||||
)
|
|
||||||
return added_count
|
|
||||||
|
|
||||||
except Exception as e: # pylint: disable=broad-except
|
|
||||||
log.warning(
|
|
||||||
"Failed to sync series to database",
|
|
||||||
error=str(e),
|
|
||||||
exc_info=True
|
|
||||||
)
|
|
||||||
return 0
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import structlog
|
|||||||
|
|
||||||
from src.config.settings import settings
|
from src.config.settings import settings
|
||||||
from src.server.database.service import AnimeSeriesService
|
from src.server.database.service import AnimeSeriesService
|
||||||
from src.server.services.anime_service import sync_legacy_series_to_db
|
|
||||||
from src.server.services.setup_service import SetupService
|
from src.server.services.setup_service import SetupService
|
||||||
|
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
@@ -237,14 +236,15 @@ async def _sync_anime_folders(progress_service=None) -> int:
|
|||||||
metadata={"step_id": "series_sync"}
|
metadata={"step_id": "series_sync"}
|
||||||
)
|
)
|
||||||
|
|
||||||
sync_count = await sync_legacy_series_to_db(settings.anime_directory)
|
# Legacy sync removed - series are loaded directly from database via _load_series_into_memory
|
||||||
logger.info("Data file sync complete. Added %d series.", sync_count)
|
sync_count = 0
|
||||||
|
logger.info("Data file sync skipped - series loaded directly from database")
|
||||||
|
|
||||||
if progress_service:
|
if progress_service:
|
||||||
await progress_service.update_progress(
|
await progress_service.update_progress(
|
||||||
progress_id="series_sync",
|
progress_id="series_sync",
|
||||||
current=75,
|
current=75,
|
||||||
message=f"Synced {sync_count} series from data files",
|
message=f"Series loaded directly from database",
|
||||||
metadata={"step_id": "series_sync"}
|
metadata={"step_id": "series_sync"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user