<?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>Jason L. Froebe - Tech tips and How Tos for Fellow Techies &#187; mp3</title>
	<atom:link href="http://froebe.net/blog/index.php/tag/mp3/feed/" rel="self" type="application/rss+xml" />
	<link>http://froebe.net/blog</link>
	<description>Tips &#38; Tricks for Databases (Sybase, Oracle, MySQL, PostgreSQL, SQLite), Windows, Linux, Solaris, Perl, Java, Bash and so much much more</description>
	<lastBuildDate>Sat, 07 Jan 2012 22:12:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Perl Script to Convert an Audiobook (m4b) to mp3 files splitting on the chapters</title>
		<link>http://froebe.net/blog/2012/01/07/perl-script-to-convert-an-audiobook-m4b-to-mp3-files-splitting-on-the-chapters/</link>
		<comments>http://froebe.net/blog/2012/01/07/perl-script-to-convert-an-audiobook-m4b-to-mp3-files-splitting-on-the-chapters/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 22:12:47 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[audiobooks]]></category>
		<category><![CDATA[chapters]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[ffprobe]]></category>
		<category><![CDATA[m4b]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[usb thumbdrive]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1371</guid>
		<description><![CDATA[I have an Nissan Altima with a BOSE radio that allows me to hook up an USB thumbdrive containing mp3 files. The problem is most of my audiobooks are in m4b format. Previously I&#8217;ve used tools like mp3splt and tried to split on &#8216;silence&#8217; or timed increments (say 15 min) but I was getting mp3 [...]]]></description>
			<content:encoded><![CDATA[<p>I have an Nissan Altima with a BOSE radio that allows me to hook up an USB thumbdrive containing mp3 files.  The problem is most of <a href="http://froebe.net/blog/2009/12/24/how-to-create-an-itunesipod-compatible-audiobook-mpeg4-m4b-on-linux-using-mp4box-and-mp4v2-v1-9-1-it-can-be-done/">my audiobooks</a> are in m4b format.  Previously I&#8217;ve used tools like mp3splt and tried to split on &#8216;silence&#8217; or timed increments (say 15 min) but I was getting mp3 files that would be split in midsentence and sometimes midword.  It became very annoying after awhile.</p>
<p>So, I came up with a really simple script to convert an audiobook (m4b) into mp3 files splitting on the chapters.  We are dependent on <a href="http://search.cpan.org/~mizzy/FFmpeg-Command/lib/FFmpeg/Command.pm">FFmpeg::Command</a> and a <a href="http://froebe.net/blog/2012/01/06/audiobook-chapter-support-for-ffprobe-perl-module/">modified FFprobe</a> Perl module. </p>
<p><strong>In the following example</strong>, we are converting a Ben Bova audiobook but we are going to specify to start the track numbering at &#8220;10&#8243; because the 2nd file ended with track &#8220;9&#8243;.</p>
<div class="bash dean_ch">jason<span class="sy0">@</span>jason-Inspiron-<span class="nu0">1545</span> ~<span class="sy0">/</span>bin $ .<span class="sy0">/</span>test_mp4_info.pl <span class="re5">-i</span> <span class="st0">&quot;/home/jason/Audiobooks/Ben Bova/Mars/Mars 3.m4b&quot;</span> <span class="re5">-o</span> mp3 <span class="re5">-a</span> <span class="st0">&quot;Mars&quot;</span> <span class="re5">-t</span> <span class="nu0">10</span><br />
Converting <span class="st0">&quot;Mars 3.m4b&quot;</span> to <span class="st0">&quot;mp3/010 Mars.mp3&quot;</span>&#8230;<br />
&nbsp; album: Mars<br />
&nbsp; artist: Ben Bova<br />
&nbsp; title: 010 &#8211; Mars<br />
&nbsp; genre: Audiobook<br />
&nbsp; track: <span class="nu0">10</span><br />
&nbsp; &#8230; COMPLETE<br />
Converting <span class="st0">&quot;Mars 3.m4b&quot;</span> to <span class="st0">&quot;mp3/011 Mars.mp3&quot;</span>&#8230;<br />
&nbsp; album: Mars<br />
&nbsp; artist: Ben Bova<br />
&nbsp; title: 011 &#8211; Mars<br />
&nbsp; genre: Audiobook<br />
&nbsp; track: <span class="nu0">11</span><br />
&nbsp; &#8230; COMPLETE<br />
Converting <span class="st0">&quot;Mars 3.m4b&quot;</span> to <span class="st0">&quot;mp3/012 Mars.mp3&quot;</span>&#8230;<br />
&nbsp; album: Mars<br />
&nbsp; artist: Ben Bova<br />
&nbsp; title: 012 &#8211; Mars<br />
&nbsp; genre: Audiobook<br />
&nbsp; track: <span class="nu0">12</span><br />
&nbsp; &#8230; COMPLETE<br />
Converting <span class="st0">&quot;Mars 3.m4b&quot;</span> to <span class="st0">&quot;mp3/013 Mars.mp3&quot;</span>&#8230;<br />
&nbsp; album: Mars<br />
&nbsp; artist: Ben Bova<br />
&nbsp; title: 013 &#8211; Mars<br />
&nbsp; genre: Audiobook<br />
&nbsp; track: <span class="nu0">13</span><br />
&nbsp; &#8230; COMPLETE<br />
Converting <span class="st0">&quot;Mars 3.m4b&quot;</span> to <span class="st0">&quot;mp3/014 Mars.mp3&quot;</span>&#8230;<br />
&nbsp; album: Mars<br />
&nbsp; artist: Ben Bova<br />
&nbsp; title: 014 &#8211; Mars<br />
&nbsp; genre: Audiobook<br />
&nbsp; track: <span class="nu0">14</span><br />
&nbsp; &#8230; COMPLETE</div>
</p>
<p><strong>Source code:</strong></p>
<blockquote><div class="perl dean_ch"><span class="co1">#!/usr/bin/perl</span></p>
<p><span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span></p>
<p><span class="kw2">use</span> lib <a href="http://perldoc.perl.org/functions/qw.html"><span class="kw3">qw</span></a><span class="br0">&#40;</span><span class="sy0">/</span>home<span class="sy0">/</span>jason<span class="sy0">/</span>bin<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw2">use</span> Getopt<span class="sy0">::</span><span class="me2">Std</span><span class="sy0">;</span><br />
<span class="kw2">use</span> File<span class="sy0">::</span><span class="me2">Basename</span><span class="sy0">;</span><br />
<span class="kw2">use</span> FFmpeg<span class="sy0">::</span><span class="me2">Command</span><span class="sy0">;</span><br />
<span class="kw2">use</span> FFprobe<span class="sy0">;</span></p>
<p><span class="co5">$|</span><span class="sy0">++;</span></p>
<p><span class="co1">###############################</span><br />
<span class="kw2">sub</span> _encode_mp3 <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$input_file</span><span class="sy0">,</span> <span class="re0">$output_dir</span><span class="sy0">,</span> <span class="re0">$album</span><span class="sy0">,</span> <span class="re0">$starting_track</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="co5">@_</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">my</span> <span class="re0">%tags</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$track_number</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$mp4</span> <span class="sy0">=</span> FFprobe<span class="sy0">-&gt;</span><span class="me1">probe_file</span><span class="br0">&#40;</span><span class="re0">$input_file</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$base_output_file</span> <span class="sy0">=</span> basename<span class="br0">&#40;</span><span class="re0">$input_file</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$base_output_file</span> <span class="sy0">=~</span> <span class="co2">s/\.\w+$//</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:comment&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>genre<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:comment&#8217;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>genre<span class="br0">&#125;</span> <span class="sy0">=~</span> <span class="co2">s/(&quot;&#8217;)//g</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:genre&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>genre<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:genre&#8217;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>genre<span class="br0">&#125;</span> <span class="sy0">=~</span> <span class="co2">s/(&quot;&#8217;)//g</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:artist&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>artist<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:artist&#8217;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>artist<span class="br0">&#125;</span> <span class="sy0">=~</span> <span class="co2">s/(&quot;&#8217;)//g</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$album</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>album<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="re0">$album</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span> <span class="kw1">elsif</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:album&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>album<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:album&#8217;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>album<span class="br0">&#125;</span> <span class="sy0">=~</span> <span class="co2">s/(&quot;&#8217;)//g</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$track_number</span> <span class="sy0">=</span> <span class="re0">$starting_track</span> <span class="kw1">if</span> <span class="re0">$starting_track</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">foreach</span> <span class="kw1">my</span> <span class="re0">$chapter</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/sort.html"><span class="kw3">sort</span></a> <a href="http://perldoc.perl.org/functions/keys.html"><span class="kw3">keys</span></a> <span class="sy0">%</span><span class="br0">&#123;</span><span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>chapters<span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">unless</span> <span class="br0">&#40;</span><span class="re0">$starting_track</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$track_number</span> <span class="sy0">=</span> <span class="re0">$chapter</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$output_file</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/sprintf.html"><span class="kw3">sprintf</span></a> <span class="st0">&quot;%s/%03d %s.mp3&quot;</span><span class="sy0">,</span> <span class="re0">$output_dir</span><span class="sy0">,</span> <span class="re0">$track_number</span><span class="sy0">,</span> <span class="re0">$tags</span><span class="br0">&#123;</span>album<span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$start</span> <span class="sy0">=</span> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>chapters<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="re0">$chapter</span><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>start<span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$duration</span> <span class="sy0">=</span> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>chapters<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="re0">$chapter</span><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>end<span class="br0">&#125;</span> <span class="sy0">-</span> <span class="re0">$start</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">@options</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$album</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>title<span class="br0">&#125;</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/sprintf.html"><span class="kw3">sprintf</span></a> <span class="st0">&quot;%03d &#8211; %s&quot;</span><span class="sy0">,</span> <span class="re0">$track_number</span><span class="sy0">,</span> <span class="re0">$album</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:title&#8217;</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>title<span class="br0">&#125;</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/sprintf.html"><span class="kw3">sprintf</span></a> <span class="st0">&quot;%03d &#8211; %s&quot;</span><span class="sy0">,</span> <span class="re0">$track_number</span><span class="sy0">,</span> <span class="re0">$mp4</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><a href="http://perldoc.perl.org/functions/format.html"><span class="kw3">format</span></a><span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="st_h">&#8216;TAG:title&#8217;</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>title<span class="br0">&#125;</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/sprintf.html"><span class="kw3">sprintf</span></a> <span class="st0">&quot;%03d &#8211; %s&quot;</span><span class="sy0">,</span> <span class="re0">$track_number</span><span class="sy0">,</span> <span class="re0">$base_output_file</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="re0">$tags</span><span class="br0">&#123;</span>title<span class="br0">&#125;</span> <span class="sy0">=~</span> <span class="co2">s/(&quot;&#8217;)//g</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$ffmpeg</span> <span class="sy0">=</span> FFmpeg<span class="sy0">::</span><span class="me2">Command</span><span class="sy0">-&gt;</span><span class="me1">new</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="re0">$ffmpeg</span><span class="sy0">-&gt;</span><span class="me1">input_options</span><span class="br0">&#40;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; file <span class="sy0">=&gt;</span> <span class="re0">$input_file</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="re0">$ffmpeg</span><span class="sy0">-&gt;</span><span class="me1">output_options</span><span class="br0">&#40;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="st_h">&#8216;file&#8217;</span> <span class="sy0">=&gt;</span> <span class="re0">$output_file</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp;<span class="st_h">&#8216;audio_codec&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;libmp3lame&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp;<span class="st_h">&#8216;audio_bit_rate&#8217;</span> <span class="sy0">=&gt;</span> <span class="nu0">64</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/printf.html"><span class="kw3">printf</span></a> <span class="st0">&quot;Converting <span class="es0">\&quot;</span>%s<span class="es0">\&quot;</span> to <span class="es0">\&quot;</span>%s<span class="es0">\&quot;</span>&#8230;<span class="es0">\n</span>&quot;</span><span class="sy0">,</span> basename<span class="br0">&#40;</span><span class="re0">$input_file</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$output_file</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="kw1">my</span> <span class="re0">$tag</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/keys.html"><span class="kw3">keys</span></a> <span class="re0">%tags</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/push.html"><span class="kw3">push</span></a> <span class="re0">@options</span><span class="sy0">,</span> <span class="st_h">&#8216;-metadata&#8217;</span><span class="sy0">,</span> <span class="re0">$tag</span> <span class="sy0">.</span> <span class="st0">&quot;=&quot;</span> <span class="sy0">.</span> <span class="re0">$tags</span><span class="br0">&#123;</span><span class="re0">$tag</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/printf.html"><span class="kw3">printf</span></a> <span class="st0">&quot;<span class="es0">\t</span>%s: %s<span class="es0">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$tag</span><span class="sy0">,</span> <span class="re0">$tags</span><span class="br0">&#123;</span><span class="re0">$tag</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/push.html"><span class="kw3">push</span></a> <span class="re0">@options</span><span class="sy0">,</span> <br />
&nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;-metadata&#8217;</span> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;track=&#8217;</span> <span class="sy0">.</span> <span class="re0">$track_number</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;-ss&#8217;</span> <span class="sy0">=&gt;</span> <span class="re0">$start</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;-t&#8217;</span> <span class="sy0">=&gt;</span> <span class="re0">$duration</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/printf.html"><span class="kw3">printf</span></a> <span class="st0">&quot;<span class="es0">\t</span>track: %d<span class="es0">\n</span>&quot;</span><span class="sy0">,</span> <span class="re0">$track_number</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="re0">$ffmpeg</span><span class="sy0">-&gt;</span><span class="me1">options</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">@options</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="re0">$ffmpeg</span><span class="sy0">-&gt;</span><span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;<span class="es0">\t</span>&#8230; COMPLETE<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$track_number</span><span class="sy0">++</span> <span class="kw1">if</span> <span class="re0">$starting_track</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="co1">###############################</span></p>
<p><span class="kw1">my</span> <span class="re0">%arg_options</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
getopts<span class="br0">&#40;</span><span class="st_h">&#8216;a:i:o:t:&#8217;</span><span class="sy0">,</span> <span class="re0">\%arg_options</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$arg_options</span><span class="br0">&#123;</span>i<span class="br0">&#125;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>o<span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$input_file</span> <span class="sy0">=</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>i<span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$output_dir</span> <span class="sy0">=</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>o<span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$starting_track</span> <span class="sy0">=</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>t<span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$album</span> <span class="sy0">=</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>a<span class="br0">&#125;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">-</span>f <span class="re0">$input_file</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">-</span>d <span class="re0">$output_dir</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; _encode_mp3<span class="br0">&#40;</span><span class="re0">$input_file</span><span class="sy0">,</span> <span class="re0">$output_dir</span><span class="sy0">,</span> <span class="re0">$album</span><span class="sy0">,</span> <span class="re0">$starting_track</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/warn.html"><span class="kw3">warn</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Unable to find file: <span class="es0">\&quot;</span>&quot;</span> <span class="sy0">.</span> <span class="re0">$input_file</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\&quot;</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span> <span class="kw1">unless</span> <span class="sy0">-</span>f <span class="re0">$input_file</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/warn.html"><span class="kw3">warn</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Unable to find dir: <span class="es0">\&quot;</span>&quot;</span> <span class="sy0">.</span> <span class="re0">$output_dir</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\&quot;</span><span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span> <span class="kw1">unless</span> <span class="sy0">-</span>f <span class="re0">$output_dir</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2012/01/07/perl-script-to-convert-an-audiobook-m4b-to-mp3-files-splitting-on-the-chapters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asher &amp; Miriam sing along</title>
		<link>http://froebe.net/blog/2010/01/20/asher-miriam-sing-along/</link>
		<comments>http://froebe.net/blog/2010/01/20/asher-miriam-sing-along/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 17:42:37 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Asher]]></category>
		<category><![CDATA[Broadway Musical]]></category>
		<category><![CDATA[lyrics]]></category>
		<category><![CDATA[Miriam]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[Phil Collins]]></category>
		<category><![CDATA[Tarzan]]></category>
		<category><![CDATA[Turk]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1184</guid>
		<description><![CDATA[Yeah, it&#8217;s Who Better Than Me by Phil Collins with the Turk and Tarzan names changed but it covers just about any two closely aged siblings IMHO: Miriam You&#8217;re one of a kind, I can&#8217;t explain it. You&#8217;re kind of cool, in a wonderful way. Though you&#8217;re weird, you can make it. And who better [...]]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/bqhZZKXfopQ&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/bqhZZKXfopQ&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Yeah, it&#8217;s <a href="http://www.amazon.com/gp/product/B0013ADZBM?ie=UTF8&amp;tag=froebe-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0013ADZBM">Who Better Than Me</a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=froebe-20&amp;l=as2&amp;o=1&amp;a=B0013ADZBM" border="0" alt="" width="1" height="1" /> by <a href="http://www.amazon.com/gp/product/B000FMQPNY?ie=UTF8&amp;tag=froebe-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000FMQPNY">Phil Collins</a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.com/e/ir?t=froebe-20&amp;l=as2&amp;o=1&amp;a=B000FMQPNY" border="0" alt="" width="1" height="1" /> with the Turk and Tarzan names changed but it covers just about any two closely aged siblings IMHO:</p>
<p><strong>Miriam</strong><a href="http://froebe.net/blog/wp-content/uploads/2010/01/Miriam_jammies_small.jpg"><img src="http://froebe.net/blog/wp-content/uploads/2010/01/Miriam_jammies_small-150x150.jpg" alt="" title="Miriam_jammies_small" width="150" height="150" class="alignright size-thumbnail wp-image-1190" /></a><br />
<span style="color: #ff00ff;">You&#8217;re one of a kind, I can&#8217;t explain it.<br />
You&#8217;re kind of cool, in a wonderful way.<br />
Though you&#8217;re weird, you can make it.<br />
And who better than me to teach you.<br />
Who better then me to set you on your way. (Mhm)</span></p>
<p><span style="color: #ff00ff;">This could take some hangin&#8217; in there<br />
Though with persuasion I can take you on up<br />
Make you grow up, beside the others<br />
And who better than me to lead you<br />
Who better than me to take you all the way (Hey hey hey yeah)</span></p>
<p><strong>Asher &amp; Miriam</strong><br />
Struggling along for years and years</p>
<p><strong>Miriam</strong><br />
<span style="color: #ff00ff;">Until I came along for you<br />
Now its all comin&#8217; together</span></p>
<p><strong>Asher &amp; Miriam</strong><br />
And together will see this through<br />
You for me and me for you</p>
<p><a href="http://froebe.net/blog/wp-content/uploads/2010/01/Asher_dishwasher_small.jpg"><img src="http://froebe.net/blog/wp-content/uploads/2010/01/Asher_dishwasher_small-150x150.jpg" alt="" title="Asher_dishwasher_small" width="150" height="150" class="alignright size-thumbnail wp-image-1191" /></a><br />
<strong>Asher</strong><br />
<span style="color: #0000ff;">I can learn, I can listen<br />
I know there&#8217;s something<br />
Deep inside but<br />
I need assistance to go the distance</span></p>
<p><strong>Miriam</strong><br />
<span style="color: #ff00ff;">And who better than me</span></p>
<p><strong>Asher</strong><br />
<span style="color: #0000ff;">To teach me</span></p>
<p><strong>Miriam</strong><br />
<span style="color: #ff00ff;">Who better than me</span></p>
<p><strong>Asher</strong><br />
<span style="color: #0000ff;">To tell me all you know</span><br />
<strong><br />
Miriam</strong><br />
<span style="color: #ff00ff;">Who better than me</span></p>
<p><strong>Asher</strong><br />
<span style="color: #0000ff;">You reach me</span></p>
<p><strong>Miriam</strong><br />
<span style="color: #ff00ff;">Who better than me</span></p>
<p><strong>Asher &amp; Miriam</strong><br />
To show them all we know!</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2010/01/20/asher-miriam-sing-along/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A better way to convert your mp3 tags using Perl, POE, Linux::Inotify2 and POE::Wheel::Run (for you Sony PS3 or other media player)</title>
		<link>http://froebe.net/blog/2009/12/15/a-better-way-to-convert-your-mp3-tags-using-perl-poe-linuxinotify2-and-poewheelrun-for-you-sony-ps3-or-other-media-player/</link>
		<comments>http://froebe.net/blog/2009/12/15/a-better-way-to-convert-your-mp3-tags-using-perl-poe-linuxinotify2-and-poewheelrun-for-you-sony-ps3-or-other-media-player/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 22:00:06 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[conversion]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[id3v1]]></category>
		<category><![CDATA[id3v2]]></category>
		<category><![CDATA[Linux::Inotify2]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[playstation]]></category>
		<category><![CDATA[POE]]></category>
		<category><![CDATA[poe::wheel:run]]></category>
		<category><![CDATA[sony play]]></category>
		<category><![CDATA[sony playstation 3]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1157</guid>
		<description><![CDATA[Yesterday, I posted Howto: Convert your mp3 tags (id3v2 to id3v1) so your Playstation 3 can play your MP3s! and it worked fine but there was one little problem with it. When we processed the files, namely running eye3D, we did so synchronously. Essentially, the file notification came in from the Linux kernel and we [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, I posted <a href="http://froebe.net/blog/2009/12/14/howto-convert-your-mp3-tags-id3v2-to-id3v1-so-your-playstation-3-can-play-your-mp3s/">Howto: Convert your mp3 tags (id3v2 to id3v1) so your Playstation 3 can play your MP3s!</a> and it worked fine but there was one little problem with it.</p>
<p>When we processed the files, namely running <strong>eye3D</strong>, we did so synchronously.  Essentially, the file notification came in from the Linux kernel and we processed the file at that time.  This may be an issue of overflowing the inotify queue within the Linux kernel if there are a lot of files to process.</p>
<p>A better solution would be to add the file to an internal queue and process the files in a sub process using POE::Wheel::Run.  Of course we will limit the number of sub processes <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="perl dean_ch"><span class="co1">#!/usr/bin/perl</span></p>
<p><span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span></p>
<p><span class="kw2">use</span> File<span class="sy0">::</span><span class="me2">Basename</span><span class="sy0">;</span><br />
<span class="kw2">use</span> File<span class="sy0">::</span><span class="me2">Find</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw2">use</span> Getopt<span class="sy0">::</span><span class="me2">Std</span><span class="sy0">;</span><br />
<span class="kw2">use</span> Linux<span class="sy0">::</span><span class="me2">Inotify2</span><span class="sy0">;</span><br />
<span class="kw2">use</span> POE <a href="http://perldoc.perl.org/functions/qw.html"><span class="kw3">qw</span></a><span class="br0">&#40;</span> Kernel Session Wheel<span class="sy0">::</span><span class="me2">Run</span> <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="co5">$|</span><span class="sy0">++;</span></p>
<p><span class="co1">#######################################</span><br />
<span class="co1">#######################################</span></p>
<p><span class="kw1">our</span> <span class="re0">@found_dirs</span><span class="sy0">;</span><br />
<span class="kw1">our</span> <span class="re0">$max_concurrent_tasks</span><span class="sy0">;</span></p>
<p><span class="kw2">sub</span> watch_add_dir <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$heap_ref</span><span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">,</span> <span class="re0">$dir_name</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="co5">@_</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="co1"># Watch this directory with a call back</span><br />
&nbsp;<span class="co1"># &nbsp;to the watch_hdlr() subroutine via</span><br />
&nbsp;<span class="co1"># &nbsp;a message to the POE system</span><br />
&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="re0">$heap_ref</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="me1">watch</span><span class="br0">&#40;</span><span class="re0">$dir_name</span><span class="sy0">,</span> IN_CREATE<span class="sy0">|</span>IN_CLOSE_WRITE<span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">-&gt;</span><span class="me1">postback</span><span class="br0">&#40;</span><span class="st0">&quot;watch_hdlr&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot; Watching directory $dir_name<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> watch_hdlr <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$kernel</span><span class="sy0">,</span> <span class="re0">$heap</span><span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">,</span> <span class="re0">$event</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="br0">&#40;</span> <span class="co5">$_</span><span class="br0">&#91;</span>KERNEL<span class="br0">&#93;</span><span class="sy0">,</span> <span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="sy0">,</span> <span class="co5">$_</span><span class="br0">&#91;</span>SESSION<span class="br0">&#93;</span><span class="sy0">,</span> <span class="co5">$_</span><span class="br0">&#91;</span>ARG1<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="kw1">my</span> <span class="re0">$name</span> <span class="sy0">=</span> <span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">fullname</span><span class="sy0">;</span><br />
&nbsp;<span class="kw1">my</span> <span class="re0">$short_name</span> <span class="sy0">=</span> <span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="co1"># We can receive many many notifications</span><br />
&nbsp;<span class="co1"># &nbsp;for a file. &nbsp;If we&#8217;ve already processed</span><br />
&nbsp;<span class="co1"># &nbsp;the file, do nothing.</span><br />
&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="kw1">unless</span> <span class="br0">&#40;</span><span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="br0">&#123;</span>files<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$name</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="co1"># If a new directory is added, we need</span><br />
&nbsp; <span class="co1"># &nbsp;to watch that directory too.</span><br />
&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">IN_CREATE</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">-</span>d <span class="re0">$name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;New directory: $name<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;watch_add_dir<span class="br0">&#40;</span><span class="re0">$heap</span><span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">,</span> <span class="re0">$name</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span> <span class="kw1">elsif</span> <span class="br0">&#40;</span><span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">IN_CLOSE_WRITE</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp;<span class="co1"># When a file descriptor that was opened for</span><br />
&nbsp; &nbsp;<span class="co1"># &nbsp;&#8217;writing&#8217; is closed, then process that</span><br />
&nbsp; &nbsp;<span class="co1"># &nbsp;file it was being written to. &nbsp;We&#8217;re</span><br />
&nbsp; &nbsp;<span class="co1"># &nbsp;assuming that the file is complete at this</span><br />
&nbsp; &nbsp;<span class="co1"># &nbsp;point as the operation will be a copy into</span><br />
&nbsp; &nbsp;<span class="co1"># &nbsp;the watched directory</span><br />
&nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp;<span class="kw1">my</span> <span class="re0">$ext</span> <span class="sy0">=</span> <span class="br0">&#40;</span> fileparse<span class="br0">&#40;</span><span class="re0">$name</span><span class="sy0">,</span> <span class="st_h">&#8216;\..*&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/lc.html"><span class="kw3">lc</span></a><span class="br0">&#40;</span><span class="re0">$ext</span><span class="br0">&#41;</span> <span class="kw1">eq</span> <span class="st_h">&#8216;.mp3&#8242;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="co1"># Add the file to the file process queue</span><br />
&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/push.html"><span class="kw3">push</span></a> <span class="sy0">@</span><span class="br0">&#123;</span> <span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>task<span class="br0">&#125;</span><span class="br0">&#123;</span>task_files<span class="br0">&#125;</span> <span class="br0">&#125;</span><span class="sy0">,</span> <span class="re0">$name</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="co1"># Mark that we have processed the file. &nbsp;If</span><br />
&nbsp; &nbsp; <span class="co1"># &nbsp;we don&#8217;t we will end up processing the file</span><br />
&nbsp; &nbsp; <span class="co1"># &nbsp;in an infinite loop because we are modifying</span><br />
&nbsp; &nbsp; <span class="co1"># &nbsp;the files.</span><br />
&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="br0">&#123;</span>files<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$name</span><span class="br0">&#125;</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="co1"># Yield to &quot;task_next_file&quot; through so</span><br />
&nbsp; &nbsp; <span class="co1"># &nbsp;that we can process files in the queue.</span><br />
&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="re0">$kernel</span><span class="sy0">-&gt;</span><span class="me1">yield</span><span class="br0">&#40;</span><span class="st0">&quot;task_next_file&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp;<span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="br0">&#123;</span>files<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$name</span><span class="br0">&#125;</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="co1"># While possible, it is highly unlikely that we will</span><br />
&nbsp;<span class="co1"># &nbsp;overflow the notification buffers within the Linux</span><br />
&nbsp;<span class="co1"># &nbsp;kernel. &nbsp;If so, we should report that.</span><br />
&nbsp;<span class="co1">##############</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;events for $name have been lost<span class="es0">\n</span>&quot;</span> <span class="kw1">if</span> <span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">IN_Q_OVERFLOW</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> task_next_file <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$kernel</span><span class="sy0">,</span> <span class="re0">$heap</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="co5">@_</span><span class="br0">&#91;</span> KERNEL<span class="sy0">,</span> HEAP <span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="co1"># Process the files in the queue up</span><br />
&nbsp;<span class="co1"># &nbsp;to the $max_concurrent_tasks at</span><br />
&nbsp;<span class="co1"># &nbsp;once. &nbsp;Any extras will be processed</span><br />
&nbsp;<span class="co1"># &nbsp;when a file (task) completes.</span><br />
&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="kw1">while</span> <span class="br0">&#40;</span> <a href="http://perldoc.perl.org/functions/keys.html"><span class="kw3">keys</span></a><span class="br0">&#40;</span> <span class="sy0">%</span><span class="br0">&#123;</span> <span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>task<span class="br0">&#125;</span> <span class="br0">&#125;</span> <span class="br0">&#41;</span> <span class="sy0">&lt;</span> <span class="re0">$max_concurrent_tasks</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$next_task_file</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a> <span class="sy0">@</span><span class="br0">&#123;</span> <span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>task<span class="br0">&#125;</span><span class="br0">&#123;</span>task_files<span class="br0">&#125;</span> <span class="br0">&#125;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="co1"># If the $next_task_file is empty, then we can safely</span><br />
&nbsp; <span class="co1"># &nbsp;ignore it.</span><br />
&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="kw1">last</span> <span class="kw1">unless</span> <a href="http://perldoc.perl.org/functions/defined.html"><span class="kw3">defined</span></a> <span class="re0">$next_task_file</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="co1"># Use POE::Wheel::Run to fire off the</span><br />
&nbsp; <span class="co1"># &nbsp;file processing using a sub process</span><br />
&nbsp; <span class="co1"># &nbsp;to the process_file() subroutine</span><br />
&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$task</span> <span class="sy0">=</span> POE<span class="sy0">::</span><span class="me2">Wheel</span><span class="sy0">::</span><span class="me2">Run</span><span class="sy0">-&gt;</span><span class="me1">new</span> <span class="br0">&#40;</span><br />
&nbsp; &nbsp; Program <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span> process_file<span class="br0">&#40;</span><span class="re0">$next_task_file</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; StdoutEvent <span class="sy0">=&gt;</span> <span class="st0">&quot;task_output&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; CloseEvent <span class="sy0">=&gt;</span> <span class="st0">&quot;task_done&quot;</span><span class="sy0">,</span><br />
&nbsp; &nbsp;<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="co1"># Update the session with the task</span><br />
&nbsp; <span class="co1"># &nbsp;information and the kernel with</span><br />
&nbsp; <span class="co1"># &nbsp;the SIG_CHILD handler. &nbsp;These are</span><br />
&nbsp; <span class="co1"># &nbsp;necessary for the task to execute.</span><br />
&nbsp; <span class="co1">##############</span><br />
&nbsp; <span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>task<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span> <span class="re0">$task</span><span class="sy0">-&gt;</span><span class="me1">ID</span> <span class="br0">&#125;</span> <span class="sy0">=</span> <span class="re0">$task</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$kernel</span><span class="sy0">-&gt;</span><span class="me1">sig_child</span><span class="br0">&#40;</span> <span class="re0">$task</span><span class="sy0">-&gt;</span><span class="me1">PID</span><span class="sy0">,</span> <span class="st0">&quot;sig_child&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> process_file <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="re0">$file</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span class="kw3">shift</span></a><span class="sy0">;</span></p>
<p>&nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot; &nbsp;Processed <span class="es0">\&quot;</span>$file<span class="es0">\&quot;</span><span class="es0">\n</span>&quot;</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="co1"># Use the eyeD3 package to convert</span><br />
&nbsp;<span class="co1"># &nbsp;the mp3 id3v2/3/4 to id3v1. &nbsp;If</span><br />
&nbsp;<span class="co1"># &nbsp;eyeD3 fails, we don&#8217;t really care. <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span><br />
&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="kw1">my</span> <span class="re0">$cmd_output</span> <span class="sy0">=</span> <span class="st0">`eyeD3 &#8211;to-v1.1 &quot;$file&quot;`</span><span class="sy0">;</span><br />
&nbsp;<span class="re0">$cmd_output</span> <span class="sy0">=</span> <span class="st0">`eyeD3 &#8211;remove-v2 &quot;$file&quot;`</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> find_wanted <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="re0">$object</span> <span class="sy0">=</span> <span class="re0">$File</span><span class="sy0">::</span><span class="me2">Find</span><span class="sy0">::</span><span class="me2">name</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">-</span>d <span class="re0">$object</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/push.html"><span class="kw3">push</span></a> <span class="re0">@found_dirs</span><span class="sy0">,</span> <span class="re0">$object</span><span class="sy0">;</span><br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="co1">#######################################</span><br />
<span class="co1">#######################################</span><br />
<span class="co1">#######################################</span></p>
<p><span class="kw1">my</span> <span class="re0">%arg_options</span><span class="sy0">;</span><br />
<span class="kw1">my</span> <span class="re0">$watch_dir</span><span class="sy0">;</span></p>
<p>getopts<span class="br0">&#40;</span><span class="st_h">&#8216;d:t:&#8217;</span><span class="sy0">,</span> <span class="re0">\%arg_options</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$arg_options</span><span class="br0">&#123;</span>d<span class="br0">&#125;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">-</span>d <span class="re0">$arg_options</span><span class="br0">&#123;</span>d<span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp;<span class="re0">$watch_dir</span> <span class="sy0">=</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>d<span class="br0">&#125;</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$arg_options</span><span class="br0">&#123;</span>t<span class="br0">&#125;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>t<span class="br0">&#125;</span> <span class="sy0">=~</span> <span class="co2">/^\d+/</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$max_concurrent_tasks</span> <span class="sy0">=</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>t<span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="re0">$max_concurrent_tasks</span> <span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">;</span><br />
&nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<span class="co1">##############</span><br />
&nbsp;<span class="co1"># We need to watch all existing sub directories</span><br />
&nbsp;<span class="co1"># &nbsp;so we will find them and add them to the</span><br />
&nbsp;<span class="co1"># &nbsp;@found_dirs array to be added to the watched</span><br />
&nbsp;<span class="co1"># &nbsp;directories when we create the Inotify object</span><br />
&nbsp;<span class="co1">##############</span><br />
&nbsp;File<span class="sy0">::</span><span class="me2">Find</span><span class="sy0">::</span><span class="me2">find</span><span class="br0">&#40;</span><span class="br0">&#123;</span>wanted <span class="sy0">=&gt;</span> <span class="re0">\&amp;find_wanted</span><span class="br0">&#125;</span><span class="sy0">,</span> <span class="re0">$watch_dir</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp;POE<span class="sy0">::</span><span class="me2">Session</span><span class="sy0">-&gt;</span><span class="me1">create</span><br />
&nbsp; <span class="br0">&#40;</span> inline_states <span class="sy0">=&gt;</span><br />
&nbsp; &nbsp;<span class="br0">&#123;</span> _start <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="kw1">my</span> <span class="re0">$inotify_FH</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># alias this particular POE session to</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;&#8217;notify&#8217; so we can easily reference</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;it later if needed</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>KERNEL<span class="br0">&#93;</span><span class="sy0">-&gt;</span><span class="me1">alias_set</span><span class="br0">&#40;</span><span class="st_h">&#8216;notify&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># Create the Linux::INotify object</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="kw2">new</span> Linux<span class="sy0">::</span><span class="me2">Inotify2</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;Unable to create new inotify object: $!&quot;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># Add the preexisting directories to</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;be watched from the @found_dirs array</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="kw1">foreach</span> <span class="kw1">my</span> <span class="re0">$dir</span> <span class="br0">&#40;</span><span class="re0">@found_dirs</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; watch_add_dir<span class="br0">&#40;</span><span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="sy0">,</span> <span class="co5">$_</span><span class="br0">&#91;</span>SESSION<span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$dir</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># We need to create a hash in the &quot;notify&quot;</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;POE session so we can determine if we&#8217;ve</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;processed a file already</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="br0">&#123;</span>files<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># The Inotify notifications are received</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;on a file descriptor. &nbsp;We need to read</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;from it when there is something to be</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># &nbsp;read</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/open.html"><span class="kw3">open</span></a> <span class="re0">$inotify_FH</span><span class="sy0">,</span> <span class="st0">&quot;&lt; &amp;=&quot;</span> <span class="sy0">.</span> <span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="me1">fileno</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;Can’t fdopen: $!<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1"># Inform POE to poll the file descriptor</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">##############</span><br />
&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>KERNEL<span class="br0">&#93;</span><span class="sy0">-&gt;</span><span class="me1">select_read</span><span class="br0">&#40;</span> <span class="re0">$inotify_FH</span><span class="sy0">,</span> <span class="st0">&quot;inotify_poll&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; inotify_poll <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="me1">poll</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; watch_hdlr <span class="sy0">=&gt;</span> <span class="re0">\&amp;watch_hdlr</span><span class="sy0">,</span></p>
<p>&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="co1"># Process the next file in the queue</span><br />
&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; task_next_file <span class="sy0">=&gt;</span> <span class="re0">\&amp;task_next_file</span><span class="sy0">,</span></p>
<p>&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="co1"># print the output of the job</span><br />
&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; task_output <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="kw1">my</span> <span class="re0">$result</span> <span class="sy0">=</span> <span class="co5">$_</span><span class="br0">&#91;</span>ARG0<span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;$result<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span></p>
<p>&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; <span class="co1"># When we are done with a file, go process the</span><br />
&nbsp; &nbsp; <span class="co1"># &nbsp;next file if there is one waiting</span><br />
&nbsp; &nbsp; <span class="co1">##############</span><br />
&nbsp; &nbsp; task_done <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$kernel</span><span class="sy0">,</span> <span class="re0">$heap</span><span class="sy0">,</span> <span class="re0">$task_id</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="co5">@_</span><span class="br0">&#91;</span> KERNEL<span class="sy0">,</span> HEAP<span class="sy0">,</span> ARG0 <span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/delete.html"><span class="kw3">delete</span></a> <span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>task<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$task_id</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp;<span class="re0">$kernel</span><span class="sy0">-&gt;</span><span class="me1">yield</span><span class="br0">&#40;</span><span class="st0">&quot;task_next_file&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; sig_child <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$heap</span><span class="sy0">,</span> <span class="re0">$pid</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="co5">@_</span><span class="br0">&#91;</span> HEAP<span class="sy0">,</span> ARG1 <span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="kw1">my</span> <span class="re0">$details</span> <span class="sy0">=</span> <a href="http://perldoc.perl.org/functions/delete.html"><span class="kw3">delete</span></a> <span class="re0">$heap</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="re0">$pid</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp;<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp;POE<span class="sy0">::</span><span class="me2">Kernel</span><span class="sy0">-&gt;</span><span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><a href="http://perldoc.perl.org/functions/exit.html"><span class="kw3">exit</span></a> <span class="nu0">0</span><span class="sy0">;</span></div>
<p>Example output:</p>
<div class="bash dean_ch">ps3_mp3_converter.pl <span class="re5">-d</span> <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>bin<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>doc<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>java<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>lib<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>j<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>j<span class="sy0">/</span>tmp<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>sdk<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>sdk<span class="sy0">/</span>demo<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>sdk<span class="sy0">/</span>include<br />
New directory: <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>Earth Final Conflict Soundtrack<br />
&nbsp;Watching directory <span class="sy0">/</span>home<span class="sy0">/</span>jfroebe<span class="sy0">/</span>j<span class="sy0">/</span>Earth Final Conflict Soundtrack<br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/01 Main Title.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/02 The Scret of Strandhill-Redemption.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/03 Old Flame.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/04 Defector.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/05 Decidion.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/06 Float Like a Butterfly.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/07 Sandoval&#8217;s Run.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/08 Bliss.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/09 If You Could Read My Mind.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/10 Lilli.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/11 Law and Order.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/12 Atavus.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/13 Between Heaven and Hell.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/14 Sleepers.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/15 Dimensions.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/16 Moonscape.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/17 Isabel.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/18 The Gauntlet.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/19 Second Chances.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/20 One Man&#8217;s Castle.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/21 Payback.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/22 Truth.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/23 Déjà Vu.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/24 Crossfire.mp3&quot;</span><br />
&nbsp; Processed <span class="st0">&quot;/home/jfroebe/j/Earth Final Conflict Soundtrack/25 Volunteers-End Credits.mp3&quot;</span></div>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/12/15/a-better-way-to-convert-your-mp3-tags-using-perl-poe-linuxinotify2-and-poewheelrun-for-you-sony-ps3-or-other-media-player/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Howto: Convert your mp3 tags (id3v2 to id3v1) so your Playstation 3 can play your MP3s!</title>
		<link>http://froebe.net/blog/2009/12/14/howto-convert-your-mp3-tags-id3v2-to-id3v1-so-your-playstation-3-can-play-your-mp3s/</link>
		<comments>http://froebe.net/blog/2009/12/14/howto-convert-your-mp3-tags-id3v2-to-id3v1-so-your-playstation-3-can-play-your-mp3s/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 22:58:26 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[conversion]]></category>
		<category><![CDATA[id3v1]]></category>
		<category><![CDATA[id3v2]]></category>
		<category><![CDATA[Linux::Inotify2]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[playstation 3]]></category>
		<category><![CDATA[POE]]></category>
		<category><![CDATA[ps3]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1154</guid>
		<description><![CDATA[Run the converter on your media server: ps3_mp3_converter.pl -d {directory} Copy your mp3 collection wherever you told ps3_mp3_converter.pl to run in. #!/usr/bin/perl use strict; use warnings; use File::Basename; use File::Find &#40;&#41;; use Getopt::Std; use Linux::Inotify2; use POE; $&#124;++; ####################################### ####################################### our @found_dirs; sub watch_add_dir &#123; &#160;my &#40;$heap_ref, $session, $dir_name&#41; = @_; &#160;$heap_ref-&#62;&#123;inotify&#125;-&#62;watch&#40;$dir_name, IN_CREATE&#124;IN_CLOSE_WRITE, $session-&#62;postback&#40;&#34;watch_hdlr&#34;&#41;&#41;; &#160;print [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Run the converter on your media server:  ps3_mp3_converter.pl -d {directory}</li>
<li>Copy your mp3 collection wherever you told ps3_mp3_converter.pl to run in.</li>
</ol>
<div class="perl dean_ch"><span class="co1">#!/usr/bin/perl</span></p>
<p><span class="kw2">use</span> strict<span class="sy0">;</span><br />
<span class="kw2">use</span> warnings<span class="sy0">;</span></p>
<p><span class="kw2">use</span> File<span class="sy0">::</span><span class="me2">Basename</span><span class="sy0">;</span><br />
<span class="kw2">use</span> File<span class="sy0">::</span><span class="me2">Find</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw2">use</span> Getopt<span class="sy0">::</span><span class="me2">Std</span><span class="sy0">;</span><br />
<span class="kw2">use</span> Linux<span class="sy0">::</span><span class="me2">Inotify2</span><span class="sy0">;</span><br />
<span class="kw2">use</span> POE<span class="sy0">;</span></p>
<p><span class="co5">$|</span><span class="sy0">++;</span></p>
<p><span class="co1">#######################################</span><br />
<span class="co1">#######################################</span></p>
<p><span class="kw1">our</span> <span class="re0">@found_dirs</span><span class="sy0">;</span></p>
<p><span class="kw2">sub</span> watch_add_dir <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$heap_ref</span><span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">,</span> <span class="re0">$dir_name</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="co5">@_</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="re0">$heap_ref</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="me1">watch</span><span class="br0">&#40;</span><span class="re0">$dir_name</span><span class="sy0">,</span> IN_CREATE<span class="sy0">|</span>IN_CLOSE_WRITE<span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">-&gt;</span><span class="me1">postback</span><span class="br0">&#40;</span><span class="st0">&quot;watch_hdlr&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot; Watching directory $dir_name<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> watch_hdlr <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$heap_ref</span><span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">,</span> <span class="re0">$event</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="br0">&#40;</span> <span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="sy0">,</span> <span class="co5">$_</span><span class="br0">&#91;</span>SESSION<span class="br0">&#93;</span><span class="sy0">,</span> <span class="co5">$_</span><span class="br0">&#91;</span>ARG1<span class="br0">&#93;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="kw1">my</span> <span class="re0">$name</span> <span class="sy0">=</span> <span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">fullname</span><span class="sy0">;</span><br />
&nbsp;<span class="kw1">my</span> <span class="re0">$short_name</span> <span class="sy0">=</span> <span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">name</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="kw1">unless</span> <span class="br0">&#40;</span><span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="br0">&#123;</span>files<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$name</span><span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">IN_CREATE</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">-</span>d <span class="re0">$name</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;New directory: $name<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;watch_add_dir<span class="br0">&#40;</span><span class="re0">$heap_ref</span><span class="sy0">,</span> <span class="re0">$session</span><span class="sy0">,</span> <span class="re0">$name</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span> <span class="kw1">elsif</span> <span class="br0">&#40;</span><span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">IN_CLOSE_WRITE</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp;<span class="kw1">my</span> <span class="re0">$ext</span> <span class="sy0">=</span> <span class="br0">&#40;</span> fileparse<span class="br0">&#40;</span><span class="re0">$name</span><span class="sy0">,</span> <span class="st_h">&#8216;\..*&#8217;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://perldoc.perl.org/functions/lc.html"><span class="kw3">lc</span></a><span class="br0">&#40;</span><span class="re0">$ext</span><span class="br0">&#41;</span> <span class="kw1">eq</span> <span class="st_h">&#8216;.mp3&#8242;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;-&quot;</span>x20 <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;$name:<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$cmd_output</span> <span class="sy0">=</span> <span class="st0">`eyeD3 &#8211;to-v1.1 &quot;$name&quot;`</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$cmd_output</span> <span class="sy0">=</span> <span class="st0">`eyeD3 &#8211;remove-v2 &quot;$name&quot;`</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="br0">&#123;</span>files<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$name</span><span class="br0">&#125;</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp;<a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;events for $name have been lost<span class="es0">\n</span>&quot;</span> <span class="kw1">if</span> <span class="re0">$event</span><span class="sy0">-&gt;</span><span class="me1">IN_Q_OVERFLOW</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> find_wanted <span class="br0">&#123;</span><br />
&nbsp;<span class="kw1">my</span> <span class="re0">$object</span> <span class="sy0">=</span> <span class="re0">$File</span><span class="sy0">::</span><span class="me2">Find</span><span class="sy0">::</span><span class="me2">name</span><span class="sy0">;</span></p>
<p>&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">-</span>d <span class="re0">$object</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/push.html"><span class="kw3">push</span></a> <span class="re0">@found_dirs</span><span class="sy0">,</span> <span class="re0">$object</span><span class="sy0">;</span><br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="co1">#######################################</span><br />
<span class="co1">#######################################</span><br />
<span class="co1">#######################################</span></p>
<p><span class="kw1">my</span> <span class="re0">%arg_options</span><span class="sy0">;</span><br />
<span class="kw1">my</span> <span class="re0">$watch_dir</span><span class="sy0">;</span></p>
<p>getopts<span class="br0">&#40;</span><span class="st_h">&#8216;d:&#8217;</span><span class="sy0">,</span> <span class="re0">\%arg_options</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$arg_options</span><span class="br0">&#123;</span>d<span class="br0">&#125;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">-</span>d <span class="re0">$arg_options</span><span class="br0">&#123;</span>d<span class="br0">&#125;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp;<span class="re0">$watch_dir</span> <span class="sy0">=</span> <span class="re0">$arg_options</span><span class="br0">&#123;</span>d<span class="br0">&#125;</span><span class="sy0">;</span><br />
&nbsp;File<span class="sy0">::</span><span class="me2">Find</span><span class="sy0">::</span><span class="me2">find</span><span class="br0">&#40;</span><span class="br0">&#123;</span>wanted <span class="sy0">=&gt;</span> <span class="re0">\&amp;find_wanted</span><span class="br0">&#125;</span><span class="sy0">,</span> <span class="re0">$watch_dir</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp;POE<span class="sy0">::</span><span class="me2">Session</span><span class="sy0">-&gt;</span><span class="me1">create</span><br />
&nbsp; <span class="br0">&#40;</span> inline_states <span class="sy0">=&gt;</span><br />
&nbsp; &nbsp;<span class="br0">&#123;</span> _start <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span class="kw1">my</span> <span class="re0">$inotify_FH</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>KERNEL<span class="br0">&#93;</span><span class="sy0">-&gt;</span><span class="me1">alias_set</span><span class="br0">&#40;</span><span class="st_h">&#8216;notify&#8217;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="kw2">new</span> Linux<span class="sy0">::</span><span class="me2">Inotify2</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;Unable to create new inotify object: $!&quot;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="kw1">foreach</span> <span class="kw1">my</span> <span class="re0">$dir</span> <span class="br0">&#40;</span><span class="re0">@found_dirs</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; watch_add_dir<span class="br0">&#40;</span><span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="sy0">,</span> <span class="co5">$_</span><span class="br0">&#91;</span>SESSION<span class="br0">&#93;</span><span class="sy0">,</span> <span class="re0">$dir</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="br0">&#123;</span>files<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<a href="http://perldoc.perl.org/functions/open.html"><span class="kw3">open</span></a> <span class="re0">$inotify_FH</span><span class="sy0">,</span> <span class="st0">&quot;&lt; &amp;=&quot;</span> <span class="sy0">.</span> <span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="me1">fileno</span><br />
&nbsp; &nbsp; &nbsp;<span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="st0">&quot;Can’t fdopen: $!<span class="es0">\n</span>&quot;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp;<span class="co5">$_</span><span class="br0">&#91;</span>KERNEL<span class="br0">&#93;</span><span class="sy0">-&gt;</span><span class="me1">select_read</span><span class="br0">&#40;</span> <span class="re0">$inotify_FH</span><span class="sy0">,</span> <span class="st0">&quot;inotify_poll&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp;inotify_poll <span class="sy0">=&gt;</span> <span class="kw2">sub</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co5">$_</span><span class="br0">&#91;</span>HEAP<span class="br0">&#93;</span><span class="br0">&#123;</span>inotify<span class="br0">&#125;</span><span class="sy0">-&gt;</span><span class="me1">poll</span><span class="sy0">;</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; watch_hdlr <span class="sy0">=&gt;</span> <span class="re0">\&amp;watch_hdlr</span><span class="sy0">,</span><br />
&nbsp; &nbsp;<span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp;<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp;POE<span class="sy0">::</span><span class="me2">Kernel</span><span class="sy0">-&gt;</span><span class="me1">run</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><a href="http://perldoc.perl.org/functions/exit.html"><span class="kw3">exit</span></a> <span class="nu0">0</span><span class="sy0">;</span></div>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/12/14/howto-convert-your-mp3-tags-id3v2-to-id3v1-so-your-playstation-3-can-play-your-mp3s/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>REVIEW: 5-in-1 White Charger/Holder/Fm Transmitter/LCD/Audio for 2.5mm and 3.5 mm/Usb Charger</title>
		<link>http://froebe.net/blog/2006/09/08/5-in-1-white-chargerholderfm-transmitterlcdaudio-for-25mm-and-35-mmusb-charger/</link>
		<comments>http://froebe.net/blog/2006/09/08/5-in-1-white-chargerholderfm-transmitterlcdaudio-for-25mm-and-35-mmusb-charger/#comments</comments>
		<pubDate>Fri, 08 Sep 2006 21:54:02 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[fm transmitter]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[meritline]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[usb charger]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/2006/09/08/5-in-1-white-chargerholderfm-transmitterlcdaudio-for-25mm-and-35-mmusb-charger/</guid>
		<description><![CDATA[5-in-1 White Charger/Holder/Fm Transmitter/LCD/Audio for 2.5mm and 3.5 mm/Usb Charger I was more than a little skeptical at this iPod/mp3 player/cell phone/usb charger &#38; FM transmitter.  There weren&#8217;t any reviews that I could find whatsoever on this contraption.  After looking around and seeing other combo units at about $90, I figured, that I would get [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/B0010Y23F0?ie=UTF8&amp;tag=froebe-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0010Y23F0">5-in-1 White Charger/Holder/Fm Transmitter/LCD/Audio for 2.5mm and 3.5 mm/Usb Charger</a></p>
<p>I was more than a little skeptical at this iPod/mp3 player/cell phone/usb charger &amp; FM transmitter.  There weren&#8217;t any reviews that<a href="http://www.amazon.com/gp/product/B0010Y23F0?ie=UTF8&amp;tag=froebe-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0010Y23F0"><img class="alignright size-medium wp-image-575" title="meritline_fm_transmitter" src="http://froebe.net/blog/wp-content/uploads/2008/07/meritline_fm_transmitter-156x300.png" alt="" width="141" height="272" /></a> I could find whatsoever on this contraption.  After looking around and seeing other combo units at about $90, I figured, that I would get one of these and worst case, I&#8217;d be out $20.</p>
<p>Well, it arrived today when I was working at home.  Of course, I had to take a little time and try it out.  Since I&#8217;ve been sick all week, I&#8217;m more than a little stir crazy to get out of the apartment even if it was just a jaunt to Starbucks and back.</p>
<p>Hooking it up was simple:</p>
<ul>
<li>slide the side grips apart</li>
<li>insert ipod</li>
<li>attach ipod cable to bottom of ipod &#8211; it is the only cable to attach <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>plug into cigarette lighter</li>
</ul>
<p>To turn it on, you hold down the power button for about 3 &#8211; 5 seconds and tune the fm transmitter to the desired channel.</p>
<p>That&#8217;s it.  The only downside I&#8217;ve found is that the FM tuner doesn&#8217;t retain the channel frequency so you will have to tune the FM channel everytime you turn it on.  I consider this a minor downside and one that I can live with.</p>
<p>Hooking up other mp3 players is done by attaching the usb cable to the mp3 player and the audio cable to the mp3 player.   Both cables are provided.  Charging a cell phone will work as long as you have the (not provided) usb &lt;=&gt; cell phone cable.</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2006/09/08/5-in-1-white-chargerholderfm-transmitterlcdaudio-for-25mm-and-35-mmusb-charger/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

