liquidsoap icon indicating copy to clipboard operation
liquidsoap copied to clipboard

Implement harbor kick via telnet

Open TheRealMattLear opened this issue 4 years ago • 7 comments

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.

TheRealMattLear avatar Jul 30 '20 05:07 TheRealMattLear

Thanks for the report!

toots avatar Jul 30 '20 23:07 toots

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..

toots avatar Jul 31 '20 00:07 toots

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

TheRealMattLear avatar Jul 31 '20 00:07 TheRealMattLear

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 avatar Jul 31 '20 04:07 TheRealMattLear

@toots any further thoughts on this?

TheRealMattLear avatar Aug 20 '20 23:08 TheRealMattLear

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] avatar Mar 19 '21 23:03 stale[bot]

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] avatar Apr 16 '22 09:04 stale[bot]