savonet / liquidsoap

Liquidsoap is a statically typed scripting general-purpose language with dedicated operators and backend for all thing media, streaming, file generation, automation, HTTP backend and more.
http://liquidsoap.info
GNU General Public License v2.0
1.4k stars 130 forks source link

Implement harbor kick via telnet #1306

Open TheRealMattLear opened 4 years ago

TheRealMattLear commented 4 years ago

I'd like to provide the ability for a new source connection to a single harbor mount id to takeover an existing connection, instead of being blocked by the "Mountpoint already taken". Furthermore i would like to determine at the time of authentication (on_connect=), who can and cannot take over the harbor mount connection, thus i have attempted to disconnect the source from the myscript.php via telnet/socket before returning "authenticated", however what i see is that liveStream.stop drops all connections including the new connection:

def on_harbor_connect(u,p) =
    ret = get_process_lines("/home/matt/myscript.php --username=#{u} --password=#{p}")
    if list.hd(default="",ret) == "authenticated" then
        true
    else
        false
    end
end

liveStream = input.harbor(id="live",on_connect=on_harbor_connect)

Ideally it would be good to be able to have a kick method from harbor telnet/socket liveStream.kick to kick only the previously connected source (but not the new connection).

I understand this could be somewhat achieved by running multiple input.harbor's with different id's but this would require a configuration change on every new/changed/removed dj and also a restart of the liquidsoap process to apply the changes. That is not ideal at all.

toots commented 4 years ago

Thanks for the report!

toots commented 4 years ago

Question: have you tried using the auth parameter? You should be able to receive username and password inside the function, determine if the caller should be getting access and call the source.stop telnet/server command from within the function, before the new user is accepted for connection or the error for mount taken is raised..

TheRealMattLear commented 4 years ago

Thanks, i'll test this out and get back to you!

TheRealMattLear commented 4 years ago

Apologies, i was actually already using auth=, not on_connect=

The full script for testing purposes is below, the results being the following:

  1. First encoder connects to harbor successfully, streams normally; not disconnected
  2. Second encoder connects and broadcasts for about 1 second before both encoders are disconnected
set("log.stdout", true);
set("log.level", 4);
set("server.socket",true)
set("server.socket.path","/home/vagrant/liquidsoap/liquidsoap.socket")

log("#### Preparing Harbor")
set("harbor.bind_addrs",["0.0.0.0"])
set("harbor.verbose",true)
def harbor_dj_auth (u,p) =

    # Disconnect existing encoder via telnet
    ret = get_process_lines("echo 'source.stop' | socat - UNIX-CONNECT:/home/vagrant/liquidsoap/liquidsoap.socket");
    log("disconnect response:");
    log(list.hd(default="",ret))

    # For testing, auth always returns true
    true

end

source = input.harbor(
    id="source",
    port = 6810,
    buffer=15.0,
    max=30.0,
    icy=true,
    password="JM7BV3kc3V4T",
    auth=harbor_dj_auth,
    ""
)

output.shoutcast(
        %mp3(
        samplerate=44100,
        bitrate=64,
        id3v2=true                  
    ),
    icy_id = 1,
    host = "localhost",
    port = 8008,
    password = "JM7BV3kc3V4T",

    name = "Stream",
    url = "",
    genre = "",
    public = true,

    icy_metadata = "true",

    mksafe(fallback(track_sensitive = false, [source, single("/home/vagrant/liquidsoap/eraser-short.mp3")]))
);

The debug output from liquidsoap:

[root@localhost liquidsoap]# ./liquidsoap liquidsoap.liq 2020/07/31 01:53:56 >>> LOG START 2020/07/31 01:53:56 [main:3] Liquidsoap 1.4.2 2020/07/31 01:53:56 [main:3] Using: bytes=[distributed with OCaml 4.02 or above] pcre=7.4.3 sedlex=2.2 menhirLib=20200624 dtools=0.4.2 duppy=0.8.0 cry=0.6.5 mm=0.5.0 ogg=0.5.2 vorbis=0.7.1 mad=0.4.5 flac=0.1.7 flac.ogg=0.1.7 dynlink=[distributed with Ocaml] lame=0.3.3 fdkaac=0.3.2 theora=0.3.1 samplerate=0.1.4 taglib=0.3.6 camomile=1.0.2 faad=0.4.0 2020/07/31 01:53:56 [lang:3] #### Preparing Harbor 2020/07/31 01:53:56 [frame:3] Using 44100Hz audio, 25Hz video, 44100Hz master. 2020/07/31 01:53:56 [frame:3] Frame size must be a multiple of 1764 ticks = 1764 audio samples = 1 video samples. 2020/07/31 01:53:56 [frame:3] Targetting 'frame.duration': 0.04s = 1764 audio samples = 1764 ticks. 2020/07/31 01:53:56 [frame:3] Frames last 0.04s = 1764 audio samples = 1 video samples = 1764 ticks. 2020/07/31 01:53:56 [decoder:4] Trying method "META" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder:4] Trying method "WAV" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder.wav/aiff:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [decoder:4] Trying method "AIFF" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder.wav/aiff:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [decoder:4] Trying method "MIDI" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder:4] Trying method "IMAGE" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder:4] Trying method "FLAC" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder.flac:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [decoder:4] Trying method "AAC" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder.aac:4] Libfaad recognizes "/home/vagrant/liquidsoap/eraser-short.mp3" as AAC (44100Hz,2 channels). 2020/07/31 01:53:56 [decoder.aac:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [decoder:4] Trying method "MP4" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder:4] Decoder "MP4" failed on "/home/vagrant/liquidsoap/eraser-short.mp3": Faad.Failed! 2020/07/31 01:53:56 [decoder:4] Trying method "OGG" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder.ogg:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [decoder:4] Trying method "MAD" for "/home/vagrant/liquidsoap/eraser-short.mp3"... 2020/07/31 01:53:56 [decoder.mad:4] Libmad recognizes "/home/vagrant/liquidsoap/eraser-short.mp3" as mpeg audio (layer III, 128kbps, 44100Hz, 2 channels). 2020/07/31 01:53:56 [decoder:3] Method "MAD" accepted "/home/vagrant/liquidsoap/eraser-short.mp3". 2020/07/31 01:53:56 [metadata.flac:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [metadata.mp4:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [decoder.ogg:4] Invalid file extension for "/home/vagrant/liquidsoap/eraser-short.mp3"! 2020/07/31 01:53:56 [sandbox:3] Sandboxing disabled 2020/07/31 01:53:56 [video.converter:3] Couldn't find preferred video converter: gavl. 2020/07/31 01:53:56 [audio.converter:3] Using samplerate converter: libsamplerate. 2020/07/31 01:53:56 [threads:4] Created thread "generic queue #1" (1 total). 2020/07/31 01:53:56 [threads:4] Created thread "generic queue #2" (2 total). 2020/07/31 01:53:56 [threads:4] Created thread "non-blocking queue #1" (3 total). 2020/07/31 01:53:56 [threads:4] Created thread "non-blocking queue #2" (4 total). 2020/07/31 01:53:56 [clock:4] Currently 1 clocks allocated. 2020/07/31 01:53:56 [clock.wallclock_main:4] Starting 1 sources... 2020/07/31 01:53:56 [source:4] Source output(dot)shoutcast gets up. 2020/07/31 01:53:56 [source:4] Source map_metadata_7315 gets up. 2020/07/31 01:53:56 [map_metadata_7315:4] Content kind is {audio=2;video=0;midi=0}. 2020/07/31 01:53:56 [source:4] Source mksafe gets up. 2020/07/31 01:53:56 [source:4] Source fallback_7312 gets up. 2020/07/31 01:53:56 [source:4] Source source gets up. 2020/07/31 01:53:56 [source:4] Content kind is {audio=2;video=0;midi=0}. 2020/07/31 01:53:56 [harbor:4] Opening port 6810 with icy = false 2020/07/31 01:53:56 [harbor:4] Opening port 6811 with icy = true 2020/07/31 01:53:56 [harbor:3] Adding mountpoint '/' on port 6810 2020/07/31 01:53:56 [source:4] Activations changed: static=[], dynamic=[fallback_7312:mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast]. 2020/07/31 01:53:56 [source:4] Source single_7311 gets up. 2020/07/31 01:53:56 [single_7311:3] "/home/vagrant/liquidsoap/eraser-short.mp3" is static, resolving once for all... 2020/07/31 01:53:56 [single_7311:4] Content kind is {audio=2;video=0;midi=0}. 2020/07/31 01:53:56 [single_7311:4] Activations changed: static=[], dynamic=[fallback_7312:mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast]. 2020/07/31 01:53:56 [fallback_7312:4] Activations changed: static=[], dynamic=[mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast]. 2020/07/31 01:53:56 [source:4] Source safe_blank gets up. 2020/07/31 01:53:56 [safe_blank:4] Content kind is {audio=2;video=0;midi=0}. 2020/07/31 01:53:56 [safe_blank:4] Activations changed: static=[], dynamic=[mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast]. 2020/07/31 01:53:56 [mksafe:4] Activations changed: static=[map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast], dynamic=[]. 2020/07/31 01:53:56 [map_metadata_7315:4] Activations changed: static=[output(dot)shoutcast:output(dot)shoutcast], dynamic=[]. 2020/07/31 01:53:56 [single_7311:3] Prepared "/home/vagrant/liquidsoap/eraser-short.mp3" (RID 0). 2020/07/31 01:53:56 [output(dot)shoutcast:4] Activations changed: static=[output(dot)shoutcast], dynamic=[]. 2020/07/31 01:53:56 [output(dot)shoutcast:4] Enabling caching mode: active source. 2020/07/31 01:53:56 [output(dot)shoutcast:3] Connecting mount sid#1 for @localhost... 2020/07/31 01:53:56 [output(dot)shoutcast:3] Connection setup was successful. 2020/07/31 01:53:56 [threads:4] Created thread "wallclock_main" (1 total). 2020/07/31 01:53:56 [clock:4] Main phase starts. 2020/07/31 01:53:56 [clock.wallclock_main:3] Streaming loop starts, synchronized with wallclock. 2020/07/31 01:53:56 [mksafe:3] Switch to fallback_7312. 2020/07/31 01:53:56 [fallback_7312:4] Activations changed: static=[mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast], dynamic=[mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast]. 2020/07/31 01:53:56 [fallback_7312:3] Switch to single_7311. 2020/07/31 01:53:56 [single_7311:4] Activations changed: static=[fallback_7312:mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast], dynamic=[fallback_7312:mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast]. 2020/07/31 01:54:00 [harbor:4] New client on port 6810: 192.168.33.1 2020/07/31 01:54:00 [harbor:4] Header: Authorization, value: Basic dGVzdDp0ZXN0. 2020/07/31 01:54:00 [harbor:4] Header: Host, value: 192.168.33.10:6810. 2020/07/31 01:54:00 [harbor:4] Header: User-Agent, value: butt 0.1.19. 2020/07/31 01:54:00 [harbor:4] Header: Content-Type, value: audio/mpeg. 2020/07/31 01:54:00 [harbor:4] Header: ice-name, value: no name. 2020/07/31 01:54:00 [harbor:4] Header: ice-public, value: 0. 2020/07/31 01:54:00 [harbor:4] Header: ice-audio-info, value: ice-bitrate=128;ice-channels=2;ice-samplerate=44100. 2020/07/31 01:54:00 [harbor:4] Requested username: test, password: test. 2020/07/31 01:54:00 [server:3] New client unix socket "". 2020/07/31 01:54:00 [server:3] Client unix socket "" disconnected without saying goodbye..! 2020/07/31 01:54:00 [lang:3] disconnect response: 2020/07/31 01:54:00 [lang:3] Done 2020/07/31 01:54:00 [harbor:4] Client logged in. 2020/07/31 01:54:00 [harbor:4] PUT (source) request on /. 2020/07/31 01:54:00 [harbor:4] Adding source on mountpoint "/" with type "audio/mpeg". 2020/07/31 01:54:00 [decoder:4] Trying method "WAV" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:4] Trying method "AIFF" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:4] Trying method "PCM/BASIC" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:4] Trying method "RAW AUDIO" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:4] Trying method "FLAC" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:4] Trying method "AAC" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:4] Trying method "OGG" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:4] Trying method "MAD" for "audio/mpeg"... 2020/07/31 01:54:00 [decoder:3] Method "MAD" accepted "audio/mpeg". 2020/07/31 01:54:00 [threads:4] Created thread "harbor source feeding" (2 total). 2020/07/31 01:54:00 [source:3] Decoding... 2020/07/31 01:54:06 [harbor:4] New client on port 6811: 192.168.33.1 2020/07/31 01:54:06 [server:3] New client unix socket "". 2020/07/31 01:54:06 [server:3] Client unix socket "" disconnected without saying goodbye..! 2020/07/31 01:54:06 [lang:3] disconnect response: 2020/07/31 01:54:06 [lang:3] Done 2020/07/31 01:54:06 [decoder:4] Decoding "/home/vagrant/liquidsoap/eraser-short.mp3" ended: Mad.End_of_stream. 2020/07/31 01:54:06 [harbor:4] Header: icy-name, value: My Stream. 2020/07/31 01:54:06 [harbor:4] Header: icy-genre, value: Pop. 2020/07/31 01:54:06 [harbor:4] Header: icy-url, value: http://google.com. 2020/07/31 01:54:06 [harbor:4] Header: icy-irc, value: N/A. 2020/07/31 01:54:06 [harbor:4] Header: icy-icq, value: 0. 2020/07/31 01:54:06 [harbor:4] Header: icy-aim, value: N/A. 2020/07/31 01:54:06 [harbor:4] Header: icy-pub, value: 0. 2020/07/31 01:54:06 [harbor:4] Header: icy-br, value: 128. 2020/07/31 01:54:06 [harbor:4] Header: content-type, value: audio/mpeg. 2020/07/31 01:54:06 [harbor:4] ICY request on /. 2020/07/31 01:54:06 [harbor:4] Adding source on mountpoint "/" with type "audio/mpeg". 2020/07/31 01:54:06 [decoder:4] Trying method "WAV" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:4] Trying method "AIFF" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:4] Trying method "PCM/BASIC" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:4] Trying method "RAW AUDIO" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:4] Trying method "FLAC" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:4] Trying method "AAC" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:4] Trying method "OGG" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:4] Trying method "MAD" for "audio/mpeg"... 2020/07/31 01:54:06 [decoder:3] Method "MAD" accepted "audio/mpeg". 2020/07/31 01:54:06 [threads:4] Created thread "harbor source feeding" (3 total). 2020/07/31 01:54:06 [source:3] Decoding... 2020/07/31 01:54:06 [harbor:4] New client on port 6810: 192.168.33.1 2020/07/31 01:54:06 [harbor:4] Header: User-Agent, value: SHOUTcast Source DSP v2.3.3.201 Title Update (Mozilla). 2020/07/31 01:54:06 [harbor:4] HTTP GET request on /admin.cgi. 2020/07/31 01:54:06 [harbor:4] HTTP Arg: song, value: Ed Sheeran - Supermarket Flowers. 2020/07/31 01:54:06 [harbor:4] HTTP Arg: mode, value: updinfo. 2020/07/31 01:54:06 [harbor:4] HTTP Arg: pass, value: test2:password. 2020/07/31 01:54:06 [harbor:4] Request to update metadata for mount / on port 6810 2020/07/31 01:54:06 [harbor:4] Requested username: source, password: test2:password. 2020/07/31 01:54:06 [server:3] New client unix socket "". 2020/07/31 01:54:06 [server:3] Client unix socket "" disconnected without saying goodbye..! 2020/07/31 01:54:06 [lang:3] disconnect response: 2020/07/31 01:54:06 [lang:3] Done 2020/07/31 01:54:06 [harbor:4] Client logged in. 2020/07/31 01:54:06 [source:3] New metadata chunk ? -- Ed Sheeran - Supermarket Flowers. 2020/07/31 01:54:07 [single_7311:4] Finished with "/home/vagrant/liquidsoap/eraser-short.mp3". 2020/07/31 01:54:07 [single_7311:3] Prepared "/home/vagrant/liquidsoap/eraser-short.mp3" (RID 0). 2020/07/31 01:54:07 [source:2] Error while reading from client: Bad file descriptor in select() 2020/07/31 01:54:07 [source:2] Feeding stopped: Mad.End_of_stream. 2020/07/31 01:54:07 [threads:4] Thread "harbor source feeding" terminated (2 remaining). 2020/07/31 01:54:07 [source:2] Error while reading from client: Bad file descriptor in select() 2020/07/31 01:54:07 [source:2] Feeding stopped: Mad.End_of_stream. 2020/07/31 01:54:07 [threads:4] Thread "harbor source feeding" terminated (1 remaining). 2020/07/31 01:54:08 [harbor:4] New client on port 6810: 192.168.33.1 2020/07/31 01:54:08 [harbor:4] Header: Authorization, value: Basic dGVzdDp0ZXN0. 2020/07/31 01:54:08 [harbor:4] Header: Host, value: 192.168.33.10:6810. 2020/07/31 01:54:08 [harbor:4] Header: User-Agent, value: butt 0.1.19. 2020/07/31 01:54:08 [harbor:4] Header: Content-Type, value: audio/mpeg. 2020/07/31 01:54:08 [harbor:4] Header: ice-name, value: no name. 2020/07/31 01:54:08 [harbor:4] Header: ice-public, value: 0. 2020/07/31 01:54:08 [harbor:4] Header: ice-audio-info, value: ice-bitrate=128;ice-channels=2;ice-samplerate=44100. 2020/07/31 01:54:08 [harbor:4] Requested username: test, password: test. 2020/07/31 01:54:08 [server:3] New client unix socket "". 2020/07/31 01:54:08 [server:3] Client unix socket "" disconnected without saying goodbye..! 2020/07/31 01:54:08 [lang:3] disconnect response: 2020/07/31 01:54:08 [lang:3] Done 2020/07/31 01:54:08 [harbor:4] Client logged in. 2020/07/31 01:54:08 [harbor:4] PUT (source) request on /. 2020/07/31 01:54:08 [harbor:4] Adding source on mountpoint "/" with type "audio/mpeg". 2020/07/31 01:54:08 [decoder:4] Trying method "WAV" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:4] Trying method "AIFF" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:4] Trying method "PCM/BASIC" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:4] Trying method "RAW AUDIO" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:4] Trying method "FLAC" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:4] Trying method "AAC" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:4] Trying method "OGG" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:4] Trying method "MAD" for "audio/mpeg"... 2020/07/31 01:54:08 [decoder:3] Method "MAD" accepted "audio/mpeg". 2020/07/31 01:54:08 [threads:4] Created thread "harbor source feeding" (2 total). 2020/07/31 01:54:08 [source:3] Decoding... ^C2020/07/31 01:54:12 [main:3] Shutdown started! 2020/07/31 01:54:12 [main:3] Waiting for main threads to terminate... 2020/07/31 01:54:12 [threads:4] Waiting for thread harbor source feeding to shutdown 2020/07/31 01:54:12 [output(dot)shoutcast:4] Activations changed: static=[], dynamic=[]. 2020/07/31 01:54:12 [source:4] Source output(dot)shoutcast gets down. 2020/07/31 01:54:12 [output(dot)shoutcast:3] Closing connection... 2020/07/31 01:54:12 [map_metadata_7315:4] Activations changed: static=[], dynamic=[]. 2020/07/31 01:54:12 [source:4] Source map_metadata_7315 gets down. 2020/07/31 01:54:12 [mksafe:4] Activations changed: static=[], dynamic=[]. 2020/07/31 01:54:12 [source:4] Source mksafe gets down. 2020/07/31 01:54:12 [fallback_7312:4] Activations changed: static=[mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast], dynamic=[]. 2020/07/31 01:54:12 [safe_blank:4] Activations changed: static=[], dynamic=[]. 2020/07/31 01:54:12 [source:4] Source safe_blank gets down. 2020/07/31 01:54:12 [fallback_7312:4] Activations changed: static=[], dynamic=[]. 2020/07/31 01:54:12 [source:4] Source fallback_7312 gets down. 2020/07/31 01:54:12 [source:4] Activations changed: static=[], dynamic=[]. 2020/07/31 01:54:12 [source:4] Source source gets down. 2020/07/31 01:54:12 [harbor:3] Removing mountpoint '/' on port 6810 2020/07/31 01:54:12 [harbor:3] Nothing more on port 6810: closing sockets. 2020/07/31 01:54:12 [single_7311:4] Activations changed: static=[fallback_7312:mksafe:map_metadata_7315:output(dot)shoutcast:output(dot)shoutcast], dynamic=[]. 2020/07/31 01:54:12 [single_7311:4] Activations changed: static=[], dynamic=[]. 2020/07/31 01:54:12 [source:4] Source single_7311 gets down. 2020/07/31 01:54:12 [single_7311:4] Finished with "/home/vagrant/liquidsoap/eraser-short.mp3". 2020/07/31 01:54:12 [clock.wallclock_main:3] Streaming loop stopped. 2020/07/31 01:54:12 [threads:4] Thread "wallclock_main" terminated (1 remaining). 2020/07/31 01:54:13 [source:2] Error while reading from client: Bad file descriptor in select() 2020/07/31 01:54:13 [source:2] Feeding stopped: Mad.End_of_stream. 2020/07/31 01:54:13 [threads:4] Thread "harbor source feeding" terminated (0 remaining). 2020/07/31 01:54:13 [main:3] Threads terminated. 2020/07/31 01:54:13 [threads:3] Shutting down scheduler... 2020/07/31 01:54:13 [threads:3] Scheduler shut down. 2020/07/31 01:54:13 [threads:3] Waiting for queue threads to terminate... 2020/07/31 01:54:13 [threads:4] Waiting for thread generic queue #1 to shutdown 2020/07/31 01:54:13 [threads:4] Thread "non-blocking queue #2" terminated (3 remaining). 2020/07/31 01:54:13 [threads:4] Thread "generic queue #2" terminated (2 remaining). 2020/07/31 01:54:13 [threads:4] Thread "non-blocking queue #1" terminated (1 remaining). 2020/07/31 01:54:13 [threads:4] Thread "generic queue #1" terminated (0 remaining). 2020/07/31 01:54:13 [threads:3] Queues shut down 2020/07/31 01:54:13 [server:3] Unlink liquidsoap.sock 2020/07/31 01:54:13 [main:3] Cleaning downloaded files... 2020/07/31 01:54:13 [main:3] Freeing memory... 2020/07/31 01:54:13 >>> LOG END

TheRealMattLear commented 4 years ago

@toots any further thoughts on this?

stale[bot] commented 3 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] commented 2 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.