Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions conserver/links/wtf_transcribe/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import json
import logging
import mimetypes
import os
import requests
from typing import Optional, Dict, Any

Expand Down Expand Up @@ -181,6 +182,23 @@ def dialog_to_audio_binary(dialog, url_timeout):
def dialog_filename(dialog, dialog_index):
return dialog.get("filename", f"audio_{dialog_index}.wav")

# Common audio/video extensions, checked before the OS MIME table: slim Linux
# images ship without /etc/mime.types, where mimetypes.guess_type("x.ogg")
# returns None even though macOS resolves it.
_MEDIA_EXTENSIONS = {
".wav": "audio/wav",
".mp3": "audio/mpeg",
".ogg": "audio/ogg",
".oga": "audio/ogg",
".opus": "audio/opus",
".m4a": "audio/mp4",
".aac": "audio/aac",
".flac": "audio/flac",
".webm": "audio/webm",
".mp4": "video/mp4",
}


def dialog_mediatype(dialog):
"""Resolve a dialog's media type.

Expand All @@ -199,6 +217,9 @@ def dialog_mediatype(dialog):

filename = dialog.get("filename")
if filename:
known = _MEDIA_EXTENSIONS.get(os.path.splitext(filename)[1].lower())
if known:
return known
guessed_type, _ = mimetypes.guess_type(filename)
if guessed_type and (guessed_type.startswith("audio/") or guessed_type.startswith("video/")):
return guessed_type
Expand Down
12 changes: 12 additions & 0 deletions conserver/links/wtf_transcribe/test_wtf_transcribe_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,3 +239,15 @@ def test_run_happy_path_installs_defaults_and_saves(
url_timeout=60,
)
mock_save_vcon.assert_called_once_with(vcon, redis)


def test_dialog_mediatype_extension_table_without_os_mime_table(monkeypatch):
# Slim Linux images have no /etc/mime.types, so guess_type() knows little.
# The built-in extension table must still resolve common audio types.
import links.wtf_transcribe as wtf

monkeypatch.setattr(wtf.mimetypes, "guess_type", lambda *_a, **_k: (None, None))
assert wtf.dialog_mediatype({"filename": "clip.ogg"}) == "audio/ogg"
assert wtf.dialog_mediatype({"filename": "CALL.MP3"}) == "audio/mpeg"
assert wtf.dialog_mediatype({"filename": "x.opus"}) == "audio/opus"
assert wtf.dialog_mediatype({"filename": "notes.txt"}) == "audio/wav"
Loading