From f81a9bfdfb66fad607e32ed29cfb19b3015e716c Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sun, 1 Jun 2025 13:16:28 +0700 Subject: [PATCH] Fix mpv being left around on abrupt termination (#4042) Closes #4015 --- qt/aqt/mpv.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/qt/aqt/mpv.py b/qt/aqt/mpv.py index 329a95538..74155814c 100644 --- a/qt/aqt/mpv.py +++ b/qt/aqt/mpv.py @@ -69,6 +69,7 @@ if is_win: # pylint: disable=import-error import pywintypes import win32file # pytype: disable=import-error + import win32job import win32pipe import winerror @@ -131,6 +132,22 @@ class MPVBase: def _start_process(self): """Start the mpv process.""" self._proc = subprocess.Popen(self.argv, env=self.popenEnv) + if is_win: + # Ensure mpv gets terminated if Anki closes abruptly. + self._job = win32job.CreateJobObject(None, "") + extended_info = win32job.QueryInformationJobObject( + self._job, win32job.JobObjectExtendedLimitInformation + ) + extended_info["BasicLimitInformation"][ + "LimitFlags" + ] = win32job.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE + win32job.SetInformationJobObject( + self._job, + win32job.JobObjectExtendedLimitInformation, + extended_info, + ) + handle = self._proc._handle # pylint: disable=no-member + win32job.AssignProcessToJobObject(self._job, handle) def _stop_process(self): """Stop the mpv process."""