diff --git a/pylib/anki/sound.py b/pylib/anki/sound.py index 99a8906f3..1dcafb1a6 100644 --- a/pylib/anki/sound.py +++ b/pylib/anki/sound.py @@ -14,8 +14,6 @@ import re from dataclasses import dataclass from typing import Union -from anki import hooks - @dataclass class TTSTag: @@ -45,7 +43,6 @@ class SoundOrVideoTag: "Prepend the media folder to the filename." # Ensure filename doesn't reference parent folder filename = os.path.basename(self.filename) - filename = hooks.media_file_filter(filename) return os.path.join(media_folder, filename) diff --git a/qt/aqt/sound.py b/qt/aqt/sound.py index 5ee281e56..5c0df22ed 100644 --- a/qt/aqt/sound.py +++ b/qt/aqt/sound.py @@ -23,6 +23,7 @@ from markdown import markdown import aqt import aqt.mpv import aqt.qt +from anki import hooks from anki.cards import Card from anki.sound import AV_REF_RE, AVTag, SoundOrVideoTag from anki.utils import is_lin, is_mac, is_win, namedtmp @@ -41,6 +42,29 @@ from aqt.utils import ( tr, ) +# Utils +########################################################################## + + +def is_in_any_collection(file_path: str) -> bool: + from aqt import mw + + file_dir = os.path.dirname(file_path) # should be "/path/to/collection.media" + profile_dir = os.path.dirname(file_dir) # e.g. "/path/to/User 1" + return ( + os.path.basename(file_dir) == "collection.media" + and os.path.basename(profile_dir) in mw.pm.profiles() + and os.path.dirname(profile_dir) == mw.pm.base + ) + + +def resolve_tag_path(tag: SoundOrVideoTag, media_folder: str) -> str: + file_path = ( + tag.filename if is_in_any_collection(tag.filename) else tag.path(media_folder) + ) + return hooks.media_file_filter(file_path) + + # AV player protocol ########################################################################## @@ -326,7 +350,7 @@ class SimpleProcessPlayer(Player): # pylint: disable=abstract-method def _play(self, tag: AVTag) -> None: assert isinstance(tag, SoundOrVideoTag) self._process = subprocess.Popen( - self.args + ["--", tag.path(self._media_folder)], + self.args + ["--", resolve_tag_path(tag, self._media_folder)], env=self.env, cwd=self._media_folder, stdout=subprocess.DEVNULL, @@ -452,7 +476,7 @@ class MpvManager(MPV, SoundOrVideoPlayer): def play(self, tag: AVTag, on_done: OnDoneCallback) -> None: assert isinstance(tag, SoundOrVideoTag) self._on_done = on_done - path = tag.path(self.media_folder) + path = resolve_tag_path(tag, self.media_folder) if self.mpv_version is None or self.mpv_version >= (0, 38, 0): self.command("loadfile", path, "replace", -1, "pause=no") @@ -503,9 +527,8 @@ class SimpleMplayerSlaveModePlayer(SimpleMplayerPlayer): def _play(self, tag: AVTag) -> None: assert isinstance(tag, SoundOrVideoTag) - self._process = subprocess.Popen( - self.args + ["--", tag.path(self.media_folder)], + self.args + ["--", resolve_tag_path(tag, self.media_folder)], env=self.env, cwd=self.media_folder, stdin=subprocess.PIPE,