Skip to content

Commit 6d690cc

Browse files
committed
feat: Active ongoing episode releasing on the time of airing
1 parent 53f9898 commit 6d690cc

File tree

2 files changed

+52
-14
lines changed

2 files changed

+52
-14
lines changed

src/program/program.py

+33-10
Original file line numberDiff line numberDiff line change
@@ -380,21 +380,44 @@ def _update_item_state(self, item_id: str) -> None:
380380
"""Update the state of a single item."""
381381
with db.Session() as session:
382382
try:
383-
item = session.execute(select(MediaItem).filter_by(id=item_id)).unique().scalar_one_or_none()
384-
if item:
385-
previous_state, new_state = item.store_state()
386-
if previous_state != new_state:
387-
self.em.add_event(Event(emitted_by="UpdateOngoing", item_id=item_id))
388-
logger.log("RELEASE", f" {item.log_string} has been released!")
389-
logger.debug(f"Changed state for {item.log_string} ({item.id}) from {previous_state.name} to {new_state.name}")
390-
session.merge(item)
391-
session.commit()
383+
item = session.execute(
384+
select(MediaItem).where(MediaItem.id == item_id)
385+
).scalar_one()
386+
387+
if not item:
388+
logger.error(f"Item {item_id} not found")
389+
return
390+
391+
# Check if this item should be scheduled for release today
392+
current_time = datetime.now().astimezone()
393+
if item.aired_at:
394+
delay_minutes = settings_manager.settings.content.trakt.release_delay_minutes
395+
delayed_time = item.aired_at + timedelta(minutes=delay_minutes)
396+
397+
# If it's a future release for today, schedule it
398+
if (delayed_time > current_time and
399+
item.aired_at.year == current_time.year and
400+
item.aired_at.month == current_time.month and
401+
item.aired_at.day == current_time.day):
402+
release_time_str = delayed_time.strftime("%I:%M %p").lstrip('0')
403+
logger.log("PROGRAM", f"Scheduling {item.log_string} for release at {release_time_str}")
404+
self.scheduled_releases[item.id] = delayed_time
405+
# If it should have been released already, release it now
406+
elif delayed_time <= current_time:
407+
previous_state, new_state = item.store_state()
408+
if previous_state != new_state:
409+
self.em.add_event(Event(emitted_by="UpdateOngoing", item_id=item.id))
410+
logger.debug(f"Updated state for {item.log_string} ({item.id}) from {previous_state.name} to {new_state.name}")
411+
412+
session.merge(item)
413+
session.commit()
392414
except Exception as e:
393415
session.rollback()
394416
logger.error(f"Failed to update scheduled state for item with ID {item_id}: {e}")
395417
finally:
396418
# Remove from scheduled releases after processing
397-
self.scheduled_releases.pop(item_id, None)
419+
if item_id in self.scheduled_releases and self.scheduled_releases[item_id] <= current_time:
420+
del self.scheduled_releases[item_id]
398421

399422
def _schedule_functions(self) -> None:
400423
"""Schedule each service based on its update interval."""

src/routers/secure/items.py

+19-4
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,11 @@ async def add_items(request: Request, imdb_ids: str = None) -> MessageResponse:
213213

214214
return {"message": f"Added {len(valid_ids)} item(s) to the queue"}
215215

216+
216217
@router.get(
217218
"/{id}",
218-
summary="Retrieve Media Item",
219-
description="Fetch a single media item by ID",
219+
summary="Retrieve Media Item By ID",
220+
description="Fetch a media item by its ID",
220221
operation_id="get_item",
221222
)
222223
async def get_item(_: Request, id: str, use_tmdb_id: Optional[bool] = False) -> dict:
@@ -227,10 +228,24 @@ async def get_item(_: Request, id: str, use_tmdb_id: Optional[bool] = False) ->
227228
query = query.where(MediaItem.tmdb_id == id)
228229
else:
229230
query = query.where(MediaItem.id == id)
230-
item = session.execute(query).unique().scalar_one()
231+
232+
# Get all matching items and use the first one
233+
items = session.execute(query).unique().scalars().all()
234+
if not items:
235+
raise HTTPException(status_code=404, detail="Item not found")
236+
237+
# Use the first item if there are multiple
238+
item = items[0]
239+
if len(items) > 1:
240+
# Log details about each duplicate
241+
logger.warning(f"Multiple items found for ID {id}:")
242+
for i, dupe in enumerate(items):
243+
logger.warning(f" {i+1}. {dupe.type} - {dupe.log_string} (ID: {dupe.id})")
244+
logger.warning(f"Using first item: {item.type} - {item.log_string}")
245+
246+
return item.to_extended_dict(with_streams=False)
231247
except NoResultFound:
232248
raise HTTPException(status_code=404, detail="Item not found")
233-
return item.to_extended_dict(with_streams=False)
234249

235250

236251
@router.get(

0 commit comments

Comments
 (0)