diff --git a/VERSION b/VERSION index 79efce5..8abba37 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.9.7-status-format-fix +2.9.8-bulk-date-update diff --git a/api/web_routes.py b/api/web_routes.py index 0963758..c378e1a 100644 --- a/api/web_routes.py +++ b/api/web_routes.py @@ -1573,7 +1573,79 @@ def register_web_routes(app, dependencies): @app.post("/api/bulk/update-source") async def api_bulk_update_source(media_type: str, old_source: str, new_source: str): return {"error": "Bulk operations not available in web container. Use core container on port 8085."} - + + @app.post("/api/episodes/bulk-update-dates") + async def api_bulk_update_episode_dates(request: Request): + """Bulk update episode dates""" + try: + data = await request.json() + episodes = data.get('episodes', []) + date_source = data.get('date_source', 'airdate') + custom_date = data.get('custom_date') + + if not episodes: + return {"success": False, "message": "No episodes provided"} + + db = dependencies["db"] + sonarr = dependencies.get("sonarr_client") + + updated_count = 0 + failed_count = 0 + + for ep in episodes: + imdb_id = ep.get('imdb_id') + season = ep.get('season') + episode = ep.get('episode') + + if not all([imdb_id, season is not None, episode is not None]): + failed_count += 1 + continue + + try: + dateadded = None + source = "manual" + + if date_source == 'airdate': + # Get airdate from Sonarr + if sonarr: + episode_data = sonarr.get_episode(imdb_id, season, episode) + if episode_data and episode_data.get('airDateUtc'): + dateadded = episode_data['airDateUtc'] + source = "sonarr:airdate" + elif date_source == 'import': + # Get import date from Sonarr history + if sonarr: + import_date = sonarr.get_episode_import_date(imdb_id, season, episode) + if import_date: + dateadded = import_date + source = "sonarr:import" + elif date_source == 'custom': + # Use custom date + if custom_date: + dateadded = custom_date + source = "manual:custom" + + if dateadded: + db.upsert_episode_dates(imdb_id, season, episode, dateadded, source) + updated_count += 1 + else: + failed_count += 1 + + except Exception as e: + print(f"❌ Error updating episode {imdb_id} S{season:02d}E{episode:02d}: {e}") + failed_count += 1 + + return { + "success": True, + "updated": updated_count, + "failed": failed_count, + "message": f"Updated {updated_count} episode(s), {failed_count} failed" + } + + except Exception as e: + print(f"❌ Bulk update error: {e}") + return {"success": False, "message": str(e)} + # Reports @app.get("/api/reports/missing-dates") async def api_missing_dates_report(): diff --git a/nfoguard-web/static/index.html b/nfoguard-web/static/index.html index 265748c..e0b9db2 100644 --- a/nfoguard-web/static/index.html +++ b/nfoguard-web/static/index.html @@ -711,6 +711,6 @@
- +