<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
  <title>Savonet / Liquidsoap 1.3.1 :: Multimedia Stream Generation</title>
  <link href="../css/new.css" type="text/css" rel="stylesheet" />
  <link href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.17/themes/base/jquery-ui.css" type="text/css" rel="stylesheet" />
  <script type="text/javascript" src="//www.google.com/jsapi"></script>
  <link rel="shortcut icon" href="../favicon.ico" />
  <script>
    google.load("jquery", "1.6.1");
    google.load("jqueryui", "1.8.14");
  </script>
  <script type="text/javascript" src="../js/jQuery.syntax/jquery.syntax.min.js"></script>
  <script type="text/javascript" src="../js/liq-jquery.js"></script>
</head>
<body>
  <div class="menu">
    <ul>
      <li id="menu-developers">
        <a href="https://github.com/savonet/liquidsoap/issues" target="_blank">developers</a></li>
      <li id="menu-flows"><a href="https://flows.liquidsoap.info/">Flows!</a></li>
      <li id="menu-doc-api-www">
        <a href="reference.html">API</a></li>
      <li id="menu-support">
        <a href="documentation.html">documentation</a></li>
      <li id="menu-download">
        <a href="../download.html">download</a></li>
      <li id="menu-about">
        <a href="../index.html">about</a></li>
    </ul>
  </div>
  <div class="section" id="main">
    <h1>Liquidsoap 1.3.1 : Geek Radio</h1>
    <div class="content">
      <h3>Geek Radio</h3>
<p>
The historical webradio, founded by David Baelde and Samuel Mimram at the ENS Lyon.
</p>
<p>
The very first version was, as many other radios, a Perl function called by Ices. It played files, one by one. On the campus, there was plenty of audio files available, so they soon wanted to index them and be able to ask easily for one file to be streamed. Samuel made a dirty campus indexer in OCaml, and David made an ugly Perl hack for adding user requests to the original system. It probably kind of worked for a while. Then they wanted something more, and realized it was all too ugly.
</p>
<p>
So they made the binding of libshout for OCaml and built the first streamer in pure OCaml. It had a simple telnet interface so an IRC bot could send user requests easily to it, same for the website. There were two request queues, one for users, one for admins. But it was still not so nicely designed, and they felt it when they needed more. They wanted scheduling, especially techno music at night.
</p>
<p>
Around that time students had to set up a project for one of their courses. David and Samuel proposed to build a complete flexible webradio system, that's Savonet. To give jobs to everybody, they had planned a complete rewriting of every part, with grand goals. A new website with so much features, a new intelligent multilingual bot, a new network libraries for glueing that, etc. Most died. But still, Liquidsoap was born, and they had plenty of new libraries for OCaml. Since then, Liquidsoap has been greatly enhanced, and is now spreading outside the ENS Lyon.
</p>
<h4>Features</h4>
<p>
The liquidsoap script schedules several static (but periodically reloaded) playlists played on different times, adds jingle to the usual stream every hour, adds short live interventions, or completely switches to live shows when available. It accepts user requests, which have priority over static playlists but not live shows, and adds speech-synthetized metadata information at the end of requests.
</p>
<p>
Geek Radio used to have a Strider daemon running to fill our database. Since that project is now dead, a simple hack is now used instead: bubble.
</p>
<p>
The usual way of sending a request is via an IRC bot, which queries the database and sends the chosen URI to liquidsoap.
</p>
      <div id="footer"> 2003-2017 Savonet team</div>
    </div>
  </div>
  <script type="text/javascript" src="//www.google.com/cse/brand?form=cse-search-box&amp;lang=en"></script>
  <script type="text/javascript" src="../js/search.js"></script>
  <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-927362-1']);
    _gaq.push(['_trackPageview']);
    (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
  </script>
</body>
</html>
