Skip to content
Snippets Groups Projects
out_stream.liq 4.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • #
    # Aura Engine (https://gitlab.servus.at/aura/engine)
    #
    # Copyright (C) 2017-2020 - The Aura Engine Team.
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU Affero General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU Affero General Public License for more details.
    #
    # You should have received a copy of the GNU Affero General Public License
    # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    # Output streaming settings
    # What a mess...
    
    # s0_encoding =
    #   get_setting("ogg", "stream_0_encoding", "AURA_ENGINE_STREAM_OUTPUT_ENCODING")
    # s0_bitrate =
    #   int_of_string(
    #     get_setting("192", "stream_0_bitrate", "AURA_ENGINE_STREAM_OUTPUT_BITRATE")
    #   )
    # s0_host = get_setting("", "stream_0_host", "AURA_ENGINE_STREAM_OUTPUT_HOST")
    # s0_port =
    #   int_of_string(
    #     get_setting("0", "stream_0_port", "AURA_ENGINE_STREAM_OUTPUT_PORT")
    #   )
    # s0_user = get_setting("", "stream_0_user", "AURA_ENGINE_STREAM_OUTPUT_USER")
    # s0_pass =
    #   get_setting("", "stream_0_password", "AURA_ENGINE_STREAM_OUTPUT_PASSWORD")
    # s0_mount =
    #   get_setting("", "stream_0_mountpoint", "AURA_ENGINE_STREAM_OUTPUT_MOUNTPOINT")
    # s0_url = get_setting("", "stream_0_url", "AURA_ENGINE_STREAM_OUTPUT_URL")
    # s0_desc =
    #   get_setting(
    #     "", "stream_0_description", "AURA_ENGINE_STREAM_OUTPUT_DESCRIPTION"
    #   )
    # s0_genre = get_setting("", "stream_0_genre", "AURA_ENGINE_STREAM_OUTPUT_GENRE")
    # s0_name = get_setting("", "stream_0_name", "AURA_ENGINE_STREAM_OUTPUT_NAME")
    # s0_channels =
    #   get_setting("", "stream_0_channels", "AURA_ENGINE_STREAM_OUTPUT_CHANNELS")
    
    # FIXME: this should move into the list of streams
    # What is this used for anyway?
    s0_connected = ref("")
    
    # s1_connected = ref('')
    # s2_connected = ref('')
    # s3_connected = ref('')
    # s4_connected = ref('')
    
    # number of streams
    stream_count = ref(0)
    
    # list of streams
    stream_list = ref([])
    
    def create_stream(stream) =
      let url = string(stream.url)
      enc = ref(%vorbis(stereo = true))
    
      # set icy_metadata accoring to the encoder (enc) to send
      # metadata via icecast
      snd_icy_metadata = ref(false)
      if
        stream.encoding == "mp3"
      then
        enc := %mp3(stereo = true)
        snd_icy_metadata := true
      end
    
      # register a server function for every stream
      # TODO: what is this used for?
    
      server.register(
    
        namespace="out_http_#{stream_count()}",
    
        "connected",
        fun (s) ->
          begin
    
      # create a list of streams to keep track of the created streams
      # if
      #   list.assoc.mem(url, stream_list())
      # then
      #   "Stream for url #{url} already exists!"
      # else
      out_stream =
        output.icecast(
          id="out_http_#{stream_count()}",
          host=stream.host,
          port=int_of_float(stream.port),
          password=stream.password,
          mount=stream.mountpoint,
          fallible=true,
          url=stream.url,
          description=stream.description,
          name=stream.name,
          genre=stream.genre,
          user=stream.user,
          send_icy_metadata=snd_icy_metadata(),
          enc(),
          output_source
        )
      stream_count := stream_count() + 1
    
      # append the new stream to the list of streams, the key is the url
      # if we could alter the unit (stream) with all its values we could
      # save all of this in the stream unit itself
      stream_list := [...stream_list(), (url, out_stream.shutdown)]
    
      print(
        "Stream: #{url}"
    
    # def create_stream(stream) =
    
    #   server.register(
    
    #     namespace="out_http_#{stream_count()}",
    
    #     "connected",
    #     fun (s) ->
    #       begin
    #         ignore(s)
    
    #       end
    #   )
    #   stream_to_icecast(
    
    #     "out_http_#{stream_count()}",
    #     stream.encoding,
    #     int_of_string(stream.bitrate),
    #     stream.host,
    #     int_of_float(stream.port),
    #     stream.password,
    #     stream.mount,
    #     stream.url,
    #     stream.desc,
    #     stream.genre,
    #     stream.user,
    
    #     output_source,
    
    #     "#{stream_count()}",
    #     s0_connected,
    #     stream.name,
    #     stream.channels
    
    #   stream_count := stream_count() + 1
    #   print(
    #     "Registered stream #{stream.url}"
    
    # itterate over all stream units (read from the yaml config)
    list.iter(create_stream, config.stream)