aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node')
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/music.py2
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/streaming.py5
-rw-r--r--packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/subtitles.py4
-rw-r--r--packages/meshbay-node/tests/test_member_errors_are_plain.py22
4 files changed, 30 insertions, 3 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/music.py b/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/music.py
index 857db33..a2d9f47 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/music.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/music.py
@@ -120,7 +120,7 @@ class MusicMixin:
blob = await _transcode_audio_to_aac(file_path)
except Exception as e:
log.warning("Audio transcode failed for %s: %s", entry.id[:12], e)
- self._send({"type": "error", "detail": f"Transcode failed: {e}"})
+ self._send({"type": "error", "detail": "This track could not be converted"})
return
transcode_hash = blake3.blake3(blob).hexdigest()
diff --git a/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/streaming.py b/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/streaming.py
index 7156e84..d6a5248 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/streaming.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/streaming.py
@@ -287,7 +287,10 @@ class StreamingMixin:
try:
probe = await _probe_video(str(file_path))
except Exception as e:
- self._send({"type": "error", "detail": f"Probe failed: {e}"})
+ # The cause to the operator's log; to the member, that it failed.
+ # ffmpeg's own words carry the operator's paths and versions.
+ log.warning("stream: probe failed for %s: %s", entry.id[:12], e)
+ self._send({"type": "error", "detail": "This video could not be read"})
return
codec_str = probe.codec
duration = probe.duration
diff --git a/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/subtitles.py b/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/subtitles.py
index 35211af..525f2a9 100644
--- a/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/subtitles.py
+++ b/packages/meshbay-node/src/meshbay_node/transport/webrtc/apps/subtitles.py
@@ -165,8 +165,10 @@ class SubtitlesMixin:
except BaseException as e:
log.warning("subtitle: extract failed file=%s track=%d after %.1fs: %r",
file_id[:12], ordinal, time.monotonic() - t0, e)
+ # The cause is in the log line above; ffmpeg's own words carry the
+ # operator's paths and versions.
self._send({"type": "error",
- "detail": f"Subtitle extraction failed: {e}"})
+ "detail": "These subtitles could not be extracted"})
if isinstance(e, asyncio.CancelledError):
raise
finally:
diff --git a/packages/meshbay-node/tests/test_member_errors_are_plain.py b/packages/meshbay-node/tests/test_member_errors_are_plain.py
new file mode 100644
index 0000000..e144e9b
--- /dev/null
+++ b/packages/meshbay-node/tests/test_member_errors_are_plain.py
@@ -0,0 +1,22 @@
+"""
+What a member is told when the media tools fail: that it failed.
+
+An exception's text from ffmpeg or ffprobe names the operator's paths, versions
+and the libraries the build has; the member who asked needs none of it, and the
+operator finds it in their log. Read from the source, because what matters is
+that no reply in these handlers carries an exception's text at all.
+"""
+
+import re
+from pathlib import Path
+
+APPS = Path(__file__).resolve().parents[1] / "src" / "meshbay_node" / "transport" / "webrtc"
+
+
+def test_no_reply_to_a_member_carries_an_exceptions_text():
+ offenders = []
+ for path in APPS.rglob("*.py"):
+ text = path.read_text(encoding="utf-8")
+ for m in re.finditer(r'"detail":\s*(f"[^"]*\{e\}[^"]*"|str\(e\))', text):
+ offenders.append(f"{path.name}: {m.group(0)}")
+ assert not offenders, offenders