#!/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/>.



# Initialize
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
    end

    playlog = [
        ("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)
    end
end


#####################################
#              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,
                input_http_1
            ],
            !inputs
        )
    )

stripped_stream = blank.strip(
        id="stripped_stream",
        track_sensitive=false,
        max_blank=fallback_max_blank,
        min_noise=fallback_min_noise,
        threshold=fallback_threshold,
        mixer
    )

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"