[Icecast] Automatic Update of MP3 Files

epicanis+icecast at dogphilosophy.net epicanis+icecast at dogphilosophy.net
Sat Sep 27 15:49:30 UTC 2014


Okay, I'm pretty new to icecast myself, and have had to work my way through 
the same kind of confusion, so I think I know where you're coming from here.
Part of the problem is that what you're describing and asking for doesn't 
really make sense...except that I know I'd have been mis-describing my 
situation pretty much the same way not too long ago so I think I understand
what you mean (and I can make a couple of suggestions). 

I would suggest that icecast actually has nothing to do with your situation 
(read below) - you can therefore probably ignore all the stuff about init 
scripts[1] for icecast in the previous discussion if you want.

Read on for some possible solutions...

> >>>>>> On 09/26/2014 12:39 AM, Gene Steinberg wrote:
>So I have a new Icecast setup with two channels, each of which carries a link 
>to MP3 files.

So, you have an icecast server configured to handle two independent streams of
mp3 data, each of which is coming from a running copy of "icegenerator"?

Part of the confusion up to this point is that icecast doesn't read mp3 files, 
or m3u files, or anything else except its own configuration file, but I think 
Mr. Ruecker is assuming that since you are being told to restart icecast by 
hand anyway that there's something very odd in icecast's setup, and if he 
gives you a typical way of dealing with this situation it will at best just 
not work, and at worst break something. He's not being insulting - the 
description you've given is a bit confusing. I imagine it is worse for someone
whose first language may not be English.  (I also have to admit that what
you've described doesn't sound like the way most system administrators would
usually choose to install and configure things, suggesting that they're either 
relatively new to it, OR are dealing with some kind of unusual situation that
might make typical approaches to fixing things difficult or 
counterproductive.)

icecast is a much simpler, "dumber" program than it looked like to me when I 
first heard about it and started trying to use it. Icecast only takes a "live" 
stream of audio or video data and passes copies of that "live" stream to media 
players that have connected to it, and nothing more. It has no idea if the 
"live stream" is coming from an actual live recording, or one giant .mp3 file, 
or a series of .mp3 files listed in a .m3u file and streamed to it one after 
the other, or what. All of those details are handled by the "source client", 
which in your case is icegenerator.

>Whenever I update the .m3u file to reflect a changed link, I have to restart 
>Icecast and the Icegenerator to make it recognize the change.

I *suspect* that you actually *don't* have to restart icecast, and the person 
who told you that it was necessary is mistaken (again, not too long ago I'd 
have also assumed that icecast needed to be restarted, too, but now that 
I've had a little time to experiment that doesn't seem to be the case).
The only thing I can figure is you've been told to do that because the 
icegenerator processes will die when the icecast connection they're talking to 
goes down. ("killall icegenerator" seems like it'd be simpler, though).

On my own setup, when the "source client" ("oggfwd" sending a stream of .opus 
data in my case, but this doesn't really matter) disconnects, the "channel" on 
my icecast server disappears.  When it reconnects, the channel reappears and 
people can connect to it again. I find I don't need to restart icecast for 
this.

>Is there a way to automate this process? So when I update the file link, 
>that’s reflected in the stream, which auto updates too?

Yes...probably. 

I think the problem is entirely just that icegenerator only looks at the .m3u 
file when it first starts up, and then after it has loaded the playlist into 
memory it closes the file and forgets about it. That would explain why you 
have to restart icegenerator every time you change the file.

How easy it would be to automate handling this kind of depends on how picky 
you are about exactly what you're asking.

>How do I go about this?

My initial suggestion would be to try a different source client. I know ices2 
apparently watches the playlist file (if that's where it's source material is 
coming from) for changes and automatically handles this, though it is only for 
.ogg [vorbis] files (I really wish it was updated to support .opus as 
well...).

There is an older "ices0"[2] that is written for .mp3 files. I'm not sure, but 
I *think* it otherwise works the same way as ices2, so it might do exactly 
what you want (automatically notice changes to the .m3u file and update the 
stream accordingly) if you replace icegenerator with it.  (If it turns out 
that monitoring the playlist file for changes is a newer feature only 
implemented in ices2, there may be other source clients for the mp3 format 
that do what you want instead.)

If you aren't willing to switch away from icegenerator for some reason, it's 
still possible but it's going to be more complicated.  Here's what I would 
try:

First - contact the icegenerator developers and ask about having icegenerator 
monitor the .m3u file for changes. It's possible that they'd be interested in 
adding that feature, or maybe even already have and it's just not documented.

Next, as an experiment, next time you modify the .m3u file try using "killall 
-HUP icegenerator" (skipping the entire complex process of manually killing 
and restarting icecast by hand and then [re-]starting icegenerator by hand 
twice).  

The "hangup" (-HUP) signal traditionally tells daemon processes to reload 
their configuration files, so it's possible that command by itself will do 
everything that you're currently doing. There's no guarantee that icegenerator 
works that way, but if it does that will make things simpler. That still 
leaves you manually running one command after updating the .m3u files, but 
it's a start.

If it doesn't work this way for icegenerator, that command should instead tell 
the instances of icegenerator to terminate normally and you can (if nothing 
else) manually run those last two "icegenerator" commands in your procedure as 
usual but skip the restarting of the icecast server.

The only way to fully automate this is to have ANOTHER, separate program 
running to monitor the .m3u files and issue the commands for you. This is 
probably not an optimal way of doing it. However:

There is a set of utilities called "inotifytools" that is specifically 
designed for watching files and directories for changes.  If that is 
installed, supposedly, something like:

while inotifywait -e modify /usr/local/etc/paracast.cfg; do
killall -HUP icegenerator
done

run as a shell script in the background would do what you're describing for 
the "paracast" feed (assuming in this case that "killall -HUP icegenerator" is 
all you need - if you need to run other commands as well you'll have to add 
them...). I should also disclaim that I've never used the inotify tools 
before, so I can't guarantee that what I wrote there would do what I think it 
does.

If you move the icegenerator stream config files to their own directory (e.g. 
/usr/local/etc/audiostreams or something of the sort) you can have inotify 
watch the whole directory of files at once instead of one file at a time.

Yes, that was kind of long, but hopefully the situation makes a little more 
sense to people reading this thread (unless I've gotten confused, too.)


[1] - on CentOS, I *think* (it's been a few years) that the init scripts are 
in /etc/init.d somewhere. The same scripts that get run automatically when the 
system boots up to make sure all the server programs (potentially including 
icecast) start up are normally ALSO used to stop or restart them. Typically if
you're restarting an icecast server on CentOS, the command would be something 
like "/etc/init.d/icecast restart", without needing a complex series of 
commands typed in by hand. If those commands really ARE necessary, then there 
is something unusual about the way it's installed.  If icecast has been 
installed "by hand" instead of using a CentOS ".rpm" package[3], that init 
file may not exist.  As I mentioned, though, this probably doesn't actually 
have anything to do with your problem...

[2] - http://icecast.org/ices/

[3] Icecast seems to be available pre-built for CentOS 6.5 in the "EPEL" 
repositories, so if installed from there I would expect the init scripts to be 
there.  ices0 and icegenerator BOTH appear to be bin the "ATrpms" repository 
as prebuilt packages as well, so they could be installed from there instead of 
built and maintained manually from source. If you have the server's system 
administrator add those two repositories (EPEL and ATrpms), you might find it 
a lot easier to install and  maintain than installing them by hand from source 
will be.



More information about the Icecast mailing list