From 708b2bd0a501e88a0469a36d335b9913c1df718f Mon Sep 17 00:00:00 2001 From: Ren Tatsumoto Date: Wed, 4 Jun 2025 10:46:12 +0300 Subject: [PATCH] check absolute path --- pylib/anki/sound.py | 8 ++++++++ qt/aqt/sound.py | 17 ++++------------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/pylib/anki/sound.py b/pylib/anki/sound.py index 1dcafb1a6..d40a895ea 100644 --- a/pylib/anki/sound.py +++ b/pylib/anki/sound.py @@ -14,6 +14,8 @@ import re from dataclasses import dataclass from typing import Union +from anki import hooks + @dataclass class TTSTag: @@ -41,8 +43,14 @@ class SoundOrVideoTag: def path(self, media_folder: str) -> str: "Prepend the media folder to the filename." + if os.path.isfile(absolute_path := os.path.abspath(self.filename)): + # Add-ons can use absolute paths to play arbitrary files on disk. + head, tail = os.path.split(absolute_path) + tail = hooks.media_file_filter(tail) + return os.path.join(head, tail) # 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 278cfee19..5ee281e56 100644 --- a/qt/aqt/sound.py +++ b/qt/aqt/sound.py @@ -23,7 +23,6 @@ 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 @@ -42,15 +41,6 @@ from aqt.utils import ( tr, ) -# Utils -########################################################################## - - -def resolve_tag_path(tag: SoundOrVideoTag, media_folder: str) -> str: - file_path = tag.filename if os.path.isfile(tag.filename) else tag.path(media_folder) - return hooks.media_file_filter(file_path) - - # AV player protocol ########################################################################## @@ -336,7 +326,7 @@ class SimpleProcessPlayer(Player): # pylint: disable=abstract-method def _play(self, tag: AVTag) -> None: assert isinstance(tag, SoundOrVideoTag) self._process = subprocess.Popen( - self.args + ["--", resolve_tag_path(tag, self._media_folder)], + self.args + ["--", tag.path(self._media_folder)], env=self.env, cwd=self._media_folder, stdout=subprocess.DEVNULL, @@ -462,7 +452,7 @@ class MpvManager(MPV, SoundOrVideoPlayer): def play(self, tag: AVTag, on_done: OnDoneCallback) -> None: assert isinstance(tag, SoundOrVideoTag) self._on_done = on_done - path = resolve_tag_path(tag, self.media_folder) + path = tag.path(self.media_folder) if self.mpv_version is None or self.mpv_version >= (0, 38, 0): self.command("loadfile", path, "replace", -1, "pause=no") @@ -513,8 +503,9 @@ class SimpleMplayerSlaveModePlayer(SimpleMplayerPlayer): def _play(self, tag: AVTag) -> None: assert isinstance(tag, SoundOrVideoTag) + self._process = subprocess.Popen( - self.args + ["--", resolve_tag_path(tag, self.media_folder)], + self.args + ["--", tag.path(self.media_folder)], env=self.env, cwd=self.media_folder, stdin=subprocess.PIPE,