Hi David!

> First, welcome to liquidsoap and this list!

Thank you!

>> I'll be running a 24/7 talk station, which will have commercials
>> throughout.  Generally, the shows will be anywhere from 1-3 hours in
>> length, and be interrupted for commercials roughly every 15 minutes.

> Obviously you can't interrupt a live show, do you plan to "overwrite"
> it, or mix the commercial on top of it?

I suppose it doesn't matter which technique I use, so long as the
commercial starts when it's supposed to.  This won't be a surprise to
the host, and they'll receive (through a completely different interface)
warnings of when they need to wrap up the segment in order for a
commercial to begin.

My original thought was literally to interrupt it, for instance, by
using switch() to specify that the mount point should play live from
04m-15m, then play a set of commercials from 15m-17m, then the show from
17m-29m, etc.  If it makes sense to simply overwrite the show, then I'm
fine with that too.  But I don't want to mix the show with the
commercial, as the show should not be broadcasting at all while the
commercials are.

> If so, I recommend smooth_add(). Anyway, assuming you treat commercials
> in the same way for playlists and live shows, this will be done last in
> the script, and can thus be put out of the way for the other question.

Okay.

>> A show may be live, or pre-recorded.  I have an Icecast2 server setup with
>> multiple mountpoints each password-protected so that show hosts can
>> stream to the mount.  Liquidsoap would then pick up the appropriate
>> mount based on a schedule, apply some processing, and stream it to a
>> second Icecast2 server that would be public-facing.

> If you have several mountpoints, you could have several
> input.http(..), one for each mountpoint. But it's a bit heavy to have
> liquidsoap actively checking perhaps 10 mounts every 10s or so.

That was the idea.  But because there might be different shows
throughout the week, each of them an hour long, there could potentially
be 168 mounts.  But if 10 mounts is taxing, then I might have to look at
another strategy.

> An alternative is input.harbor(), did you consider it? It's not perfect,
> but it's slightly more flexible than icecast (e.g. supports
> time-dependent authentication) and is more efficient (direct
> connection from the client to liquidsoap). Some people here have used
> harbor with one mount for multiple DJs, I don't know if they sticked
> to it.

I hadn't considered it, though that might be the way to go.  The reason
I originally had separate mount points is because Icecast has per-mount
authentication, but not time-dependent AFAIK.  If input.harbor()
supports time-dependent authentication, that would probably be
preferable.  I could eliminate the first Icecast server altogether.

Does it support all of the various clients that Icecast does (i.e.
shoutcast, ices, darkice, etc)?  If so, I think I'd like to pursue in
this direction.

>> If this was a static setup, I could easily tell it to go to one
>> mountpoint from 1h-2h, to the second from 2h-3h, etc, and interrupt
>> every 15 minutes for a playlist.  But the shows will change, and in will
>> change in length (two one-hour shows might be replaced with one two-hour
>> show, so I can't have it switching mountpoints on the host).

> If you have several input.http() you could dynamically switch from one
> to the other using switch() and dynamic predicates. For example:
>   switch(track_sensitive=false,[
>     ({test_process("test -f file_one")},mount_one),
>     ({test_process("test -f file_two")},mount_two),
>   ...])

> Using mix() you can also obtain a more efficient mechanism (one which
> doesn't poll files continuously) for the same effect.

Can you elaborate on this?  It looks interesting, but I'm not sure I'm
following.

>> source = switch([ { 0s }, get_process_output("external_script") ])

>> It would call "external_script" every 60 seconds, which would return
>> either "/path/to/file.mp3" or "http://host:8000/mount"; (or perhaps a
>> playlist of local mp3 files totaling 60 seconds in length).
>> "external_script" would reference a local database to find out what is
>> to be played next.  "external_script" has not been written yet, so I can
>> make it do whatever needs to be done.

> Hehe, it so happens that I have just created an operator that make
> that kind of thing easy. It's source.dynamic(), only available on SVN,
> but it's probably not mature enough for that kind of application.
> Generally, it's currently not supported to dynamically create "active"
> sources such as input.http/harbor(). It is, however, one of the goals
> of an ongoing change (the "clock" business if you read the SVN log).
> Anyway, with great power comes great responsibility, which would
> probably be too much for a first-time use, so don't feel too sorry
> that you can't try that yet ;)

No problem.. I'd prefer to stick with what's available via Ubuntu's
package manager.  Only because if there are problems, I like ruling out
the possibility that I installed the software incorrectly :-).

> I hope this little discussion helps you to see what's possible. There
> is more than one way to do it, it depends on your specific needs. Feel
> free to ask for more details!

It does help, and than you for the information so far.  I really do
appreciate it!

-- 
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Website : http://www.nickcoons.com  | Location :         Tempe, AZ  USA
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Savonet-users mailing list
Savonet-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/savonet-users

Reply via email to