<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Richard Jones, Esq. &#187; netcat</title>
	<atom:link href="http://www.metabrew.com/article/tag/netcat/feed" rel="self" type="application/rss+xml" />
	<link>http://www.metabrew.com</link>
	<description>Erlang, PHP, C, C++, Java, PostgreSQL, MySQL, Hadoop, Linux, awk, bash, sed, grep, screen, vim, irc, ssh etc...</description>
	<lastBuildDate>Sun, 20 Dec 2009 18:59:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Transcoding HTTP mp3 streaming proxy in bash</title>
		<link>http://www.metabrew.com/article/transcoding-http-mp3-streaming-proxy-in-bash/</link>
		<comments>http://www.metabrew.com/article/transcoding-http-mp3-streaming-proxy-in-bash/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 21:01:09 +0000</pubDate>
		<dc:creator>RJ</dc:creator>
				<category><![CDATA[hacks]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[netcat]]></category>
		<category><![CDATA[streaming]]></category>

		<guid isPermaLink="false">http://www.metabrew.com/?p=58</guid>
		<description><![CDATA[Here&#8217;s how to make a proxy for streaming mp3s. It transcodes on-the-fly to 64kpbs MP3 using lame. When transcoding is finished, it calls the ./posthandler.sh script, which can either just delete the file, or potentially archive it so you don&#8217;t need to transcode it again. #!/bin/bash read method url version &#160; method=&#34;${method%$CR}&#34; url=&#34;${url%$CR}&#34; version=&#34;${version%$CR}&#34; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s how to make a proxy for streaming mp3s. It transcodes on-the-fly to 64kpbs MP3 using lame. When transcoding is finished, it calls the ./posthandler.sh script, which can either just delete the file, or potentially archive it so you don&#8217;t need to transcode it again.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re3">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">read</span> method url version</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">method=</span><span class="st0">&quot;${method%$CR}&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="re2">url=</span><span class="st0">&quot;${url%$CR}&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">version=</span><span class="st0">&quot;${version%$CR}&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> -ne <span class="st0">&quot;HTTP/1.0 200 OK<span class="es0">\r</span><span class="es0">\n</span>Content-type: audio/mpeg<span class="es0">\r</span><span class="es0">\n</span><span class="es0">\r</span><span class="es0">\n</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re2">BR=</span><span class="nu0">64</span> <span class="re3">#birate to transcode to.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PIPE=</span><span class="st0">&quot;/tmp/$$.pipe&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">mkfifo</span> <span class="st0">&quot;$PIPE&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">OUTFILE=</span><span class="st0">&quot;./tmp.$$.$BR.mp3&quot;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">rm</span> <span class="re1">$OUTFILE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">url=</span>`<span class="kw3">echo</span> <span class="st0">&quot;$url&quot;</span> | <span class="kw2">sed</span> <span class="st0">&#8216;s/<span class="es0">\/</span>//&#8217;</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;** GET $url&quot;</span> &gt;&amp;<span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">nohup</span> <span class="kw2">lynx</span> &#8211;<span class="kw3">source</span> <span class="st0">&quot;$url&quot;</span> \</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; | <span class="br0">&#40;</span>lame &#8211;preset cbr <span class="re1">$BR</span> &#8211;mp3input &#8211; - <span class="nu0">2</span>&gt;/dev/null \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &amp;&amp; <span class="br0">&#40;</span><span class="kw3">echo</span> <span class="st0">&quot;** Finished transcoding $url&quot;</span> &gt;&amp;<span class="nu0">2</span> ; \</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ./posthandler.<span class="kw2">sh</span> <span class="st0">&quot;$OUTFILE&quot;</span>&amp;<span class="br0">&#41;</span><span class="br0">&#41;</span>\</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; | <span class="kw2">tee</span> -i <span class="st0">&quot;$PIPE&quot;</span> &gt; <span class="re1">$OUTFILE</span> &amp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">cat</span> &lt; <span class="re1">$PIPE</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">rm</span> <span class="re1">$PIPE</span></div>
</li>
</ol>
</div>
<p><br/></p>
<p>One interesting limitation seems to be the buffer size of a fifo pipe in linux. Even though the transcoding step is pretty quick, if a client is connected the transcoding only manages to fill the pipe a couple of hundred k ahead of what is being read. </p>
<p>The -i flag to `tee` means it ignores interrupts, and will finish transcoding the file and call the posthandler even if the client disconnects.</p>
<p>Run is like this:</p>
<p><code>while [ 1 ]; do nc -vlp 8080 -c './transstreamer.sh' ; done</code></p>
<p>Then hit up a url of your choice using your awesome new proxy:</p>
<p><code>mpg321 "http://localhost:8080/http://freedownloads.last.fm/download/105468518/Letters%2BFrom%2BThe%2BBoatman.mp3"</code></p>
<p>Not the most scalable solution, but a mildly amusing quick hack.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.metabrew.com/article/transcoding-http-mp3-streaming-proxy-in-bash//feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
