mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 14:02:21 -04:00
Separate player for videos on Windows
https://forums.ankiweb.net/t/anki-crashes-because-of-mpv/3359/13
This commit is contained in:
parent
41d74592f0
commit
e2d98ebc26
1 changed files with 46 additions and 5 deletions
|
@ -71,6 +71,23 @@ class Player(ABC):
|
||||||
"Do any cleanup required at program termination. Optional."
|
"Do any cleanup required at program termination. Optional."
|
||||||
|
|
||||||
|
|
||||||
|
AUDIO_EXTENSIONS = {
|
||||||
|
"wav",
|
||||||
|
"mp3",
|
||||||
|
"ogg",
|
||||||
|
"flac",
|
||||||
|
"m4a",
|
||||||
|
"3gp",
|
||||||
|
"spx",
|
||||||
|
"oga",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def is_audio_file(fname: str) -> bool:
|
||||||
|
ext = fname.split(".")[-1].lower()
|
||||||
|
return ext in AUDIO_EXTENSIONS
|
||||||
|
|
||||||
|
|
||||||
class SoundOrVideoPlayer(Player): # pylint: disable=abstract-method
|
class SoundOrVideoPlayer(Player): # pylint: disable=abstract-method
|
||||||
default_rank = 0
|
default_rank = 0
|
||||||
|
|
||||||
|
@ -81,6 +98,26 @@ class SoundOrVideoPlayer(Player): # pylint: disable=abstract-method
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class SoundPlayer(Player): # pylint: disable=abstract-method
|
||||||
|
default_rank = 0
|
||||||
|
|
||||||
|
def rank_for_tag(self, tag: AVTag) -> Optional[int]:
|
||||||
|
if isinstance(tag, SoundOrVideoTag) and is_audio_file(tag.filename):
|
||||||
|
return self.default_rank
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class VideoPlayer(Player): # pylint: disable=abstract-method
|
||||||
|
default_rank = 0
|
||||||
|
|
||||||
|
def rank_for_tag(self, tag: AVTag) -> Optional[int]:
|
||||||
|
if isinstance(tag, SoundOrVideoTag) and not is_audio_file(tag.filename):
|
||||||
|
return self.default_rank
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Main playing interface
|
# Main playing interface
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
@ -247,7 +284,6 @@ class SimpleProcessPlayer(Player): # pylint: disable=abstract-method
|
||||||
self._process = subprocess.Popen(
|
self._process = subprocess.Popen(
|
||||||
self.args + [tag.filename],
|
self.args + [tag.filename],
|
||||||
env=self.env,
|
env=self.env,
|
||||||
startupinfo=startup_info(),
|
|
||||||
stdout=subprocess.DEVNULL,
|
stdout=subprocess.DEVNULL,
|
||||||
stderr=subprocess.DEVNULL,
|
stderr=subprocess.DEVNULL,
|
||||||
)
|
)
|
||||||
|
@ -290,7 +326,9 @@ class SimpleProcessPlayer(Player): # pylint: disable=abstract-method
|
||||||
cb()
|
cb()
|
||||||
|
|
||||||
|
|
||||||
class SimpleMpvPlayer(SimpleProcessPlayer, SoundOrVideoPlayer):
|
class SimpleMpvPlayer(SimpleProcessPlayer, VideoPlayer):
|
||||||
|
default_rank = 1
|
||||||
|
|
||||||
args, env = _packagedCmd(
|
args, env = _packagedCmd(
|
||||||
[
|
[
|
||||||
"mpv",
|
"mpv",
|
||||||
|
@ -300,14 +338,13 @@ class SimpleMpvPlayer(SimpleProcessPlayer, SoundOrVideoPlayer):
|
||||||
"--audio-display=no",
|
"--audio-display=no",
|
||||||
"--keep-open=no",
|
"--keep-open=no",
|
||||||
"--input-media-keys=no",
|
"--input-media-keys=no",
|
||||||
"--no-config",
|
"--autoload-files=no",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, taskman: TaskManager, base_folder: str) -> None:
|
def __init__(self, taskman: TaskManager, base_folder: str) -> None:
|
||||||
super().__init__(taskman)
|
super().__init__(taskman)
|
||||||
conf_path = os.path.join(base_folder, "mpv.conf")
|
self.args += ["--config-dir=" + base_folder]
|
||||||
self.args += ["--include=" + conf_path]
|
|
||||||
|
|
||||||
|
|
||||||
class SimpleMplayerPlayer(SimpleProcessPlayer, SoundOrVideoPlayer):
|
class SimpleMplayerPlayer(SimpleProcessPlayer, SoundOrVideoPlayer):
|
||||||
|
@ -657,6 +694,10 @@ def setup_audio(taskman: TaskManager, base_folder: str) -> None:
|
||||||
|
|
||||||
if mpvManager is not None:
|
if mpvManager is not None:
|
||||||
av_player.players.append(mpvManager)
|
av_player.players.append(mpvManager)
|
||||||
|
|
||||||
|
if isWin:
|
||||||
|
mpvPlayer = SimpleMpvPlayer(taskman, base_folder)
|
||||||
|
av_player.players.append(mpvPlayer)
|
||||||
else:
|
else:
|
||||||
mplayer = SimpleMplayerSlaveModePlayer(taskman)
|
mplayer = SimpleMplayerSlaveModePlayer(taskman)
|
||||||
av_player.players.append(mplayer)
|
av_player.players.append(mplayer)
|
||||||
|
|
Loading…
Reference in a new issue