blob: 306be060d1b5cdcca26a45554db93440dc11e7f9 (
plain)
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
|
module Fig.Web.Module.HLS
( public
) where
import Fig.Prelude
import Data.Functor ((<&>))
import Fig.Web.Utils
import Fig.Web.Types
import qualified Fig.Web.DB as DB
public :: PublicModule
public a = do
onGet "/api/hls.m3u8" do
mseq :: Maybe Integer <- ((readMaybe . unpack . decodeUtf8)=<<) <$> DB.get a.db "hlssequence"
mlen <- DB.llen a.db "hlssamples"
case (mseq, mlen) of
(Just seq, Just len) -> do
let startingSeq = seq - (len - 1)
respondText $ mconcat
[ "#EXTM3U\n"
, "#EXT-X-VERSION: 4\n"
, "#EXT-X-TARGETDURATION:5\n"
, "#EXT-X-MEDIA-SEQUENCE:", tshow startingSeq, "\n"
, mconcat $ reverse [0,1..len] <&> \idx -> mconcat
[ "#EXTINF:3.0,\n"
, "http://localhost:8080/api/hls/", tshow idx, "/sample.aac\n"
]
]
_ -> do
status status404
respondText "no HLS stream"
pure ()
onGet "/api/hls/:num/sample.aac" do
num <- pathParam "num"
DB.lindex a.db "hlssamples" num >>= \case
Nothing -> do
status status404
respondText "sample not found"
Just val -> respondBytes val
|