diff --git a/backend/program/db/db_functions.py b/backend/program/db/db_functions.py index 1ad43079..e1783dbb 100644 --- a/backend/program/db/db_functions.py +++ b/backend/program/db/db_functions.py @@ -35,11 +35,9 @@ def _get_item_from_db(session, item: MediaItem): match type: case "movie": r = session.execute(select(Movie).where(MediaItem.imdb_id==item.imdb_id).options(joinedload("*"))).unique().scalar_one() - session.expunge(r) return r case "show": r = session.execute(select(Show).where(MediaItem.imdb_id==item.imdb_id).options(joinedload("*"))).unique().scalar_one() - session.expunge(r) for season in r.seasons: for episode in season.episodes: episode.parent = season @@ -49,7 +47,6 @@ def _get_item_from_db(session, item: MediaItem): r = session.execute(select(Season).where(Season._id==item._id).options(joinedload("*"))).unique().scalar_one() r.parent = r.parent r.parent.seasons = r.parent.seasons - session.expunge(r) for episode in r.episodes: episode.parent = r return r @@ -59,7 +56,6 @@ def _get_item_from_db(session, item: MediaItem): r.parent.parent = r.parent.parent r.parent.parent.seasons = r.parent.parent.seasons r.parent.episodes = r.parent.episodes - session.expunge(r) return r case _: logger.error(f"_get_item_from_db Failed to create item from type: {type}") @@ -110,9 +106,18 @@ def _run_thread_with_db_item(fn, service, program, input_item: MediaItem | None) session.expunge_all() return res for i in fn(input_item): + if isinstance(i, (Show, Movie, Season, Episode)): + with db.Session() as session: + _check_for_and_run_insertion_required(session, i) + program._push_event_queue(Event(emitted_by=service, item=i)) yield i return else: for i in fn(): - yield i + if isinstance(i, (Show, Movie, Season, Episode)): + with db.Session() as session: + _check_for_and_run_insertion_required(session, i) + program._push_event_queue(Event(emitted_by=service, item=i)) + else: + program._push_event_queue(Event(emitted_by=service, item=i)) return \ No newline at end of file diff --git a/backend/program/program.py b/backend/program/program.py index 6e4e2283..f81c91ea 100644 --- a/backend/program/program.py +++ b/backend/program/program.py @@ -151,11 +151,16 @@ def start(self): run_migrations() with db.Session() as session: res = session.execute(select(func.count(MediaItem._id))).scalar_one() + added = [] if res == 0: for item in self.services[SymlinkLibrary].run(): if settings_manager.settings.map_metadata: if isinstance(item, (Movie, Show)): item = next(self.services[TraktIndexer].run(item)) + if item.item_id in added: + logger.error(f"Cannot enhance metadata, {item.title} ({item.item_id}) contains multiple folders. Manual resolution required.") + exit(0) + added.append(item.item_id) item.store_state() session.add(item) logger.debug(f"Mapped metadata to {item.type.title()}: {item.log_string}") @@ -379,7 +384,7 @@ def run(self): with db.Session() as session: existing_item = DB._get_item_from_db(session, event.item) updated_item, next_service, items_to_submit = process_event( - existing_item, event.emitted_by, event.item + existing_item, event.emitted_by, existing_item if existing_item is not None else event.item ) if updated_item and isinstance(existing_item, (Movie, Show)) and updated_item.state == States.Symlinked: