-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathaudio_controller.ex
More file actions
87 lines (69 loc) · 2.19 KB
/
audio_controller.ex
File metadata and controls
87 lines (69 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
defmodule ScreensWeb.V2.AudioController do
use ScreensWeb, :controller
require Logger
alias Phoenix.View
alias Screens.Config.Cache
alias Screens.V2.ScreenAudioData
plug(:check_config)
defp check_config(conn, _) do
if Cache.ok?(), do: conn, else: not_found(conn)
end
def show(conn, %{"id" => screen_id} = params) do
real_screen? = Map.get(params, "is_real_screen", false)
disposition = if Map.has_key?(params, "inline"), do: :inline, else: :attachment
_ = Screens.LogScreenData.log_audio_request(screen_id, params)
cond do
not screen_exists?(screen_id) -> not_found(conn)
Cache.disabled?(screen_id) -> disabled(conn)
true -> readout(conn, screen_id, real_screen?, disposition)
end
end
def show_volume(conn, %{"id" => screen_id}) do
cond do
not screen_exists?(screen_id) ->
not_found(conn)
Cache.disabled?(screen_id) ->
json(conn, %{volume: 0.0})
true ->
{:ok, volume} = ScreenAudioData.volume_by_screen_id(screen_id)
json(conn, %{volume: volume})
end
end
def debug(conn, %{"id" => screen_id}) do
cond do
not screen_exists?(screen_id) -> not_found(conn)
Cache.disabled?(screen_id) -> text(conn, "Screen #{screen_id} is disabled.")
true -> text(conn, fetch_ssml(screen_id))
end
end
defp readout(conn, screen_id, real_screen?, disposition) do
screen_id
|> fetch_ssml()
|> Screens.Audio.synthesize(screen_id: screen_id, is_screen: real_screen?)
|> case do
{:ok, audio_data} ->
send_download(conn, {:binary, audio_data},
filename: "readout.mp3",
disposition: disposition
)
:error ->
not_found(conn)
end
end
defp fetch_ssml(screen_id) do
widget_audio_data = ScreenAudioData.by_screen_id(screen_id)
render_ssml(widget_audio_data: widget_audio_data)
end
defp render_ssml(template_assigns) do
View.render_to_string(ScreensWeb.V2.AudioView, "index.ssml", template_assigns)
end
defp disabled(conn) do
not_found(conn)
end
defp not_found(conn) do
send_resp(conn, 404, "Not found")
end
defp screen_exists?(screen_id) do
not is_nil(Cache.screen(screen_id))
end
end