summaryrefslogtreecommitdiff
path: root/fig-web/src/Fig/Web/Module/HLS.hs
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