Skip to content
Snippets Groups Projects
engine.liq 4.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/liquidsoap
    
    #
    # 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/>.
    
    
    
    
    icecast_vorbis_metadata = false
    
    inputs = ref ([])
    
    engine_state = {
        is_fallback = ref(false)
    }
    
    # Load settings from ini file
    %include "settings.liq"
    
    
    # Include library functions
    
    %include "library.liq"
    
    
    # Include dependency-free functions
    %include "functions.liq"
    
    #####################################
    #              EVENTS               #
    #####################################
    
    
    # Updates the playout state
    def on_playout_state_change(source_type) =
        if source_type == "fallback" then
            engine_state.is_fallback := true
        else
            engine_state.is_fallback := false
        end
    end
    
    
    # Called when some new metadata info is available
    def on_metadata_notification(meta) =
    
        # FIXME For some reason stream channels do not pass the `source` property in meta
        channel_name = meta["source"]
        source_type = eval_source_type(channel_name)
        on_playout_state_change(source_type)
    
        log(level=3, label="metadata", "Raw metadata before POST:\n\n #{meta}\n\n")
    
        show_name = ref(list.assoc(default="", "show_name", meta))
    
        show_id = ref(list.assoc(default="", "show_id", meta))
    
        timeslot_id = list.assoc(default="-1", "timeslot_id", meta)
        playlist_id = list.assoc(default="-1", "playlist_id", meta)
        playlist_track_num = list.assoc(default="", "playlist_item", meta)
    
        track_start = list.assoc(default=meta["track_start"], "on_air", meta)
        track_duration = get_meta_track_duration(meta)
        track_type = eval_track_type(meta["track_type"], meta["source"])
        track_artist = list.assoc(default=meta["track_artist"], "artist", meta)
        track_album = list.assoc(default=meta["track_album"], "album", meta)
        track_title = list.assoc(default=meta["track_title"], "title", meta)
    
    
        if source_type == "fallback" then
    
            log(level=3, label="metadata", "Detected FALLBACK channel `#{channel_name}` playing \
    
                (Show ID: #{!fallback_show_id})")
            show_name := !fallback_show_name
            show_id := !fallback_show_id
    
            ("log_source", engine_id),
    
            ("show_name", !show_name),
            ("show_id", !show_id),
            ("timeslot_id", timeslot_id),
            ("playlist_id", playlist_id),
            ("track_type", track_type),
            ("track_start", track_start),
            ("track_duration", "#{track_duration}"),
            ("track_title", track_title),
            ("track_album", track_album),
            ("track_artist", track_artist),
            ("track_num", playlist_track_num)
        ]
    
        if playlog["show_id"] == "" then
            log(level=3, label="metadata", "Skip posting playlog because of missing show ID!")
        else
    
            post_playlog(engine_api_playlog, playlog)
    
    #####################################
    #              INPUTS               #
    #####################################
    
    # Enable queue sources
    %include "in_queue.liq"
    
    # Enable fallback sources
    %include "in_fallback.liq"
    
    # Enable stream overtakes
    %include "in_stream.liq"
    
    # Enabled line in from soundcard
    %include "in_soundcard.liq"
    
    
    #####################################
    #             ROUTING               #
    #####################################
    
    
    mixer = mix(id="mixer",
    
            list.append(
                [
    
                    input_filesystem_0,
                    input_filesystem_1,
                    input_http_0,
    
    stripped_stream = blank.strip(
            id="stripped_stream",
    
            track_sensitive=false,
            max_blank=fallback_max_blank,
            min_noise=fallback_min_noise,
            threshold=fallback_threshold,
    
    output_source = attach_fallback_source(stripped_stream)
    
    #####################################
    #             OUTPUTS               #
    #####################################
    
    # create soundcard output
    %include "out_soundcard.liq"
    
    # stream output
    %include "out_stream.liq"
    
    # enable socket functions
    %include "serverfunctions.liq"