<?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; Perl</title>
	<atom:link href="http://froebe.net/blog/index.php/tag/perl/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>Audiobook chapter support for FFprobe (Perl) module</title>
		<link>http://froebe.net/blog/2012/01/06/audiobook-chapter-support-for-ffprobe-perl-module/</link>
		<comments>http://froebe.net/blog/2012/01/06/audiobook-chapter-support-for-ffprobe-perl-module/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 02:37:59 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[Diogo Franco]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[ffprobe]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[perl module]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1364</guid>
		<description><![CDATA[I have multiple audiobook files (m4b) that ffprobe is able to retrieve the chapters from just fine&#8230; except the chapter information is printed to stderr and never in the formatted (STDOUT) output. The Perl module FFprobe doesn&#8217;t handle the chapters so I submitted feature request #73803 Feature request is to format the chapter output. jason@jason-Inspiron-1545 [...]]]></description>
			<content:encoded><![CDATA[<h4>I have multiple audiobook files (m4b) that <a href="http://ffmpeg.org/">ffprobe</a> is able to retrieve the chapters from just fine&#8230; except the chapter information is printed to stderr and never in the formatted (STDOUT) output.  The Perl module <a href="http://search.cpan.org/~kovensky/FFprobe/lib/FFprobe.pm">FFprobe</a> doesn&#8217;t handle the chapters so I submitted <a href="https://rt.cpan.org/Ticket/Display.html?id=73803">feature request #73803</a></h4>
<h4>Feature request is to format the chapter output.</h4>
<div class="bash dean_ch">jason<span class="sy0">@</span>jason-Inspiron-<span class="nu0">1545</span> ~<span class="sy0">/</span>bin $ ffprobe <span class="st0">&quot;/home/jason/Audiobooks/Ben Bova/Mars/Mars 1.m4b&quot;</span> <span class="nu0">1</span><span class="sy0">&gt;/</span>dev<span class="sy0">/</span>null<br />
&#8230;.<br />
&nbsp; libavutil &nbsp; &nbsp;<span class="nu0">51</span>. &nbsp;<span class="nu0">7</span>. <span class="nu0">0</span> <span class="sy0">/</span> <span class="nu0">51</span>. &nbsp;<span class="nu0">7</span>. <span class="nu0">0</span><br />
&nbsp; libavcodec &nbsp; <span class="nu0">53</span>. &nbsp;<span class="nu0">5</span>. <span class="nu0">0</span> <span class="sy0">/</span> <span class="nu0">53</span>. &nbsp;<span class="nu0">5</span>. <span class="nu0">0</span><br />
&nbsp; libavformat &nbsp;<span class="nu0">53</span>. &nbsp;<span class="nu0">2</span>. <span class="nu0">0</span> <span class="sy0">/</span> <span class="nu0">53</span>. &nbsp;<span class="nu0">2</span>. <span class="nu0">0</span><br />
&nbsp; libavdevice &nbsp;<span class="nu0">53</span>. &nbsp;<span class="nu0">0</span>. <span class="nu0">0</span> <span class="sy0">/</span> <span class="nu0">53</span>. &nbsp;<span class="nu0">0</span>. <span class="nu0">0</span><br />
&nbsp; libavfilter &nbsp; <span class="nu0">2</span>. &nbsp;<span class="nu0">4</span>. <span class="nu0">0</span> <span class="sy0">/</span> &nbsp;<span class="nu0">2</span>. &nbsp;<span class="nu0">4</span>. <span class="nu0">0</span><br />
&nbsp; libswscale &nbsp; &nbsp;<span class="nu0">2</span>. &nbsp;<span class="nu0">0</span>. <span class="nu0">0</span> <span class="sy0">/</span> &nbsp;<span class="nu0">2</span>. &nbsp;<span class="nu0">0</span>. <span class="nu0">0</span><br />
&nbsp; libpostproc &nbsp;<span class="nu0">52</span>. &nbsp;<span class="nu0">0</span>. <span class="nu0">0</span> <span class="sy0">/</span> <span class="nu0">52</span>. &nbsp;<span class="nu0">0</span>. <span class="nu0">0</span><br />
<span class="br0">&#91;</span>mov,mp4,m4a,3gp,3g2,mj2 <span class="sy0">@</span> 0xddfac0<span class="br0">&#93;</span> max_analyze_duration reached<br />
Input <span class="co0">#0, mov,mp4,m4a,3gp,3g2,mj2, from &#8216;/home/jason/Audiobooks/Ben Bova/Mars/Mars 1.m4b&#8217;:</span><br />
&nbsp; Metadata:<br />
&nbsp; &nbsp; major_brand &nbsp; &nbsp; : M4B <br />
&nbsp; &nbsp; minor_version &nbsp; : <span class="nu0">0</span><br />
&nbsp; &nbsp; compatible_brands: M4B mp42isom<br />
&nbsp; &nbsp; creation_time &nbsp; : <span class="nu0">2009</span>-09-08 <span class="nu0">16</span>:<span class="nu0">19</span>:<span class="nu0">29</span><br />
&nbsp; &nbsp; album &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Mars<br />
&nbsp; &nbsp; artist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: Ben Bova<br />
&nbsp; &nbsp; genre &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Audiobook<br />
&nbsp; Duration: 03:<span class="nu0">51</span>:<span class="nu0">23.41</span>, start: <span class="nu0">0.000000</span>, bitrate: <span class="nu0">81</span> kb<span class="sy0">/</span>s<br />
&nbsp; &nbsp; Chapter <span class="co0">#0.0: start 0.000000, end 2779.567914</span><br />
&nbsp; &nbsp; Metadata:<br />
&nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Mars &#8211; 01 of <span class="nu0">24</span><br />
&nbsp; &nbsp; Chapter <span class="co0">#0.1: start 2779.567914, end 5555.049161</span><br />
&nbsp; &nbsp; Metadata:<br />
&nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Mars &#8211; 02 of <span class="nu0">24</span><br />
&nbsp; &nbsp; Chapter <span class="co0">#0.2: start 5555.049161, end 8334.617075</span><br />
&nbsp; &nbsp; Metadata:<br />
&nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Mars &#8211; 03 of <span class="nu0">24</span><br />
&nbsp; &nbsp; Chapter <span class="co0">#0.3: start 8334.617075, end 11110.098322</span><br />
&nbsp; &nbsp; Metadata:<br />
&nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Mars &#8211; 04 of <span class="nu0">24</span><br />
&nbsp; &nbsp; Chapter <span class="co0">#0.4: start 11110.098322, end 13883.419864</span><br />
&nbsp; &nbsp; Metadata:<br />
&nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Mars &#8211; 05 of <span class="nu0">24</span><br />
&nbsp; &nbsp; Stream <span class="co0">#0.0(und): Audio: aac, 44100 Hz, stereo, s16, 80 kb/s</span><br />
&nbsp; &nbsp; Metadata:<br />
&nbsp; &nbsp; &nbsp; creation_time &nbsp; : <span class="nu0">2009</span>-09-08 <span class="nu0">16</span>:<span class="nu0">19</span>:<span class="nu0">29</span><br />
&nbsp; &nbsp; Stream <span class="co0">#0.1(eng): Subtitle: text / 0&#215;74786574</span><br />
&nbsp; &nbsp; Metadata:<br />
&nbsp; &nbsp; &nbsp; creation_time &nbsp; : <span class="nu0">2009</span>-09-08 <span class="nu0">17</span>:<span class="nu0">31</span>:00<br />
Unsupported codec with <span class="kw2">id</span> <span class="nu0">94213</span> <span class="kw1">for</span> input stream <span class="nu0">1</span><br />
jason<span class="sy0">@</span>jason-Inspiron-<span class="nu0">1545</span> ~<span class="sy0">/</span>bin $ </div>
<h4>patch to add m4b chapter support:</h4>
<div class="perl dean_ch">82c82<br />
<span class="sy0">&lt;</span> <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$tree</span><span class="sy0">,</span> <span class="re0">$branch</span><span class="sy0">,</span> <span class="re0">$tag</span><span class="sy0">,</span> <span class="re0">$stream</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy0">&#8212;</span><br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$tree</span><span class="sy0">,</span> <span class="re0">$branch</span><span class="sy0">,</span> <span class="re0">$tag</span><span class="sy0">,</span> <span class="re0">$stream</span><span class="sy0">,</span> <span class="re0">$chapter</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
100c100<span class="sy0">,</span><span class="nu0">108</span><br />
<span class="sy0">&lt;</span> <span class="br0">&#125;</span><br />
<span class="sy0">&#8212;</span><br />
<span class="sy0">&gt;</span> &nbsp; <span class="br0">&#125;</span> <span class="kw1">elsif</span> <span class="br0">&#40;</span><span class="re0">$line</span> <span class="sy0">=~</span> <span class="co2">m/Chapter \#(\d+\.*\d+): start (\d+\.*\d+)\, end (\d+\.*\d+)/i</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$start</span><span class="sy0">,</span> <span class="re0">$end</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="co3">$2</span><span class="sy0">,</span> <span class="co3">$3</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; <span class="re0">$chapter</span> <span class="sy0">=</span> <span class="co3">$1</span><span class="sy0">;</span><br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; <span class="re0">$chapter</span> <span class="sy0">=~</span> <span class="co2">s/\.//g</span><span class="sy0">;</span><br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; <span class="re0">$chapter</span> <span class="sy0">=~</span> <span class="co2">s/^0+(\d)/$1/</span><span class="sy0">;</span><br />
<span class="sy0">&gt;</span> <br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; <span class="re0">$$tree</span><span class="br0">&#123;</span>chapters<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$chapter</span><span class="br0">&#125;</span> <span class="sy0">=</span> <span class="br0">&#123;</span> start <span class="sy0">=&gt;</span> <span class="re0">$start</span><span class="sy0">,</span> end <span class="sy0">=&gt;</span> <span class="re0">$end</span> <span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">elsif</span> <span class="br0">&#40;</span><span class="re0">$line</span> <span class="sy0">=~</span> <span class="co2">/title\s+: (.+)$/</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; <span class="re0">$$tree</span><span class="br0">&#123;</span>chapters<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="re0">$chapter</span><span class="br0">&#125;</span><span class="br0">&#123;</span>title<span class="br0">&#125;</span> <span class="sy0">=</span> <span class="co3">$1</span><span class="sy0">;</span><br />
101a110<br />
<span class="sy0">&gt;</span> &nbsp; <span class="br0">&#125;</span></div>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2012/01/06/audiobook-chapter-support-for-ffprobe-perl-module/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Run multiple versions of Perl from your home directory</title>
		<link>http://froebe.net/blog/2010/11/22/run-multiple-versions-of-perl-from-your-home-directory/</link>
		<comments>http://froebe.net/blog/2010/11/22/run-multiple-versions-of-perl-from-your-home-directory/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 04:07:46 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[Kang-min Liu]]></category>
		<category><![CDATA[perlbrew]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1288</guid>
		<description><![CDATA[Run multiple versions of Perl from your home directory using Perlbrew! One thing to know:  Perl won&#8217;t compile if you have an encrypted home directory. Bug has been fixed but not exactly how and it hasn&#8217;t been put into the Ubuntu updates yet. Thanks goes to Kang-min Liu for creating Perlbrew!!!! The recommended way to [...]]]></description>
			<content:encoded><![CDATA[<p>Run multiple versions of Perl from your home directory using <a href="http://search.cpan.org/dist/App-perlbrew/lib/App/perlbrew.pm">Perlbrew</a>!<a href="http://search.cpan.org/dist/App-perlbrew/lib/App/perlbrew.pm"><img class="alignright" title="Kang-min Liu" src="http://external.ak.fbcdn.net/safe_image.php?d=cbda410c3d38aac55ff886e3270f01c3&amp;w=90&amp;h=90&amp;url=http%3A%2F%2Fwww.gravatar.com%2Favatar.php%3Fgravatar_id%3Dae74261cb1cdcc52eb0d2b1cbaf06e25%26rating%3DG%26size%3D80%26default%3Dhttp%3A%2F%2Fst.pimg.net%2Ftucs%2Fimg%2Fwho.png" alt="" width="80" height="80" /></a></p>
<div id="id_4ceb3c83b6a110a34130872">One thing to know:  Perl  won&#8217;t compile if you have an encrypted home directory. <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Bug has been  fixed but not exactly how and it hasn&#8217;t been put into the Ubuntu updates  yet.</div>
<div>Thanks goes to Kang-min Liu for creating Perlbrew!!!! <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </div>
<div>
<blockquote><p><em>The recommended way to install perlbrew is to run these statements in your shell:</em></p>
<div class="bash dean_ch">&nbsp; &nbsp; curl <span class="re5">-LO</span> http:<span class="sy0">//</span>xrl.us<span class="sy0">/</span>perlbrew<br />
&nbsp; &nbsp; <span class="kw2">chmod</span> +x perlbrew<br />
&nbsp; &nbsp; .<span class="sy0">/</span>perlbrew <span class="kw2">install</span></div>
<p><em>After that, <code>perlbrew</code> installs itself to <code>~/perl5/perlbrew/bin</code>, and you should follow the instruction on screen to setup your <code>.bashrc</code> or <code>.cshrc</code> to put it in your PATH.</em></p></blockquote>
</div>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2010/11/22/run-multiple-versions-of-perl-from-your-home-directory/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Perl Books online</title>
		<link>http://froebe.net/blog/2010/11/22/perl-books-online/</link>
		<comments>http://froebe.net/blog/2010/11/22/perl-books-online/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 01:23:10 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[chromatic]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[modern perl]]></category>
		<category><![CDATA[reference]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1282</guid>
		<description><![CDATA[Modern Perl by chromatic (FREE ebook!) and The Perl Language Reference Manual (for Perl version 5.12.1)]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.onyxneon.com/books/modern_perl/index.html"><img class="alignnone" title="Modern Perl  by chromatic" src="http://www.onyxneon.com/books/modern_perl/mp_cover_full.png" alt="Modern Perl  by chromatic" width="120" height="180" /></a>Modern Perl by chromatic (<a href="http://www.modernperlbooks.com/mt/2010/11/the-book-is-out.html">FREE ebook!</a>)</p>
<p>and</p>
<p><img class="alignnone" title="The Perl Language Reference Manual (for Perl version 5.12.1)" src="http://www.network-theory.co.uk/perl/language/9781906966027-tiny" alt="The Perl Language Reference Manual (for Perl version 5.12.1)" width="84" height="128" /></p>
<p><a href="http://www.network-theory.co.uk/docs/perlref/">The Perl Language Reference Manual (for Perl version 5.12.1)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2010/11/22/perl-books-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Howto:  Unable to start Catalyst web applications using the built in development server?  We have the answer</title>
		<link>http://froebe.net/blog/2010/05/16/howto-unable-to-start-catalyst-web-applications-using-the-built-in-development-server-we-have-the-answer/</link>
		<comments>http://froebe.net/blog/2010/05/16/howto-unable-to-start-catalyst-web-applications-using-the-built-in-development-server-we-have-the-answer/#comments</comments>
		<pubDate>Sun, 16 May 2010 13:18:00 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[catalyst]]></category>
		<category><![CDATA[catalyst web framework]]></category>
		<category><![CDATA[catalyst::devel]]></category>
		<category><![CDATA[catalyst::engine::http::restarter]]></category>
		<category><![CDATA[catalyst::restarter]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1241</guid>
		<description><![CDATA[If you&#8217;re getting the &#8220;Can&#8217;t locate Catalyst/Engine/HTTP/Restarter.pm&#8221; error message, it is very likely you&#8217;re running a recent version of Catalyst: jason@catalyst:~/catalyst-book-code/Chapter_3/LolCatalyst-Lite$ script/lolcatalyst_lite_server.pl -r Can&#8216;t locate Catalyst/Engine/HTTP/Restarter.pm in @INC (@INC contains: /home/jason/catalyst-book-code/Chapter_3/LolCatalyst-Lite/script/../lib /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .). at /usr/lib/perl5/Class/MOP.pm line 116 &#160; &#160; &#160; &#160; Class::MOP::load_first_existing_class(&#8216;Catalyst::Engine::HTTP::Restarter&#8216;) called at /usr/lib/perl5/Class/MOP.pm line 121 &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re getting the &#8220;Can&#8217;t locate Catalyst/Engine/HTTP/Restarter.pm&#8221; error message, it is very likely you&#8217;re running a recent version of Catalyst:</p>
<div class="perl dean_ch">jason<span class="re0">@catalyst</span><span class="sy0">:~/</span>catalyst<span class="sy0">-</span>book<span class="sy0">-</span>code<span class="sy0">/</span>Chapter_3<span class="sy0">/</span>LolCatalyst<span class="sy0">-</span>Lite$ script<span class="sy0">/</span>lolcatalyst_lite_server<span class="sy0">.</span>pl <span class="sy0">-</span>r<br />
Can<span class="st_h">&#8216;t locate Catalyst/Engine/HTTP/Restarter.pm in @INC (@INC contains: /home/jason/catalyst-book-code/Chapter_3/LolCatalyst-Lite/script/../lib /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .). at /usr/lib/perl5/Class/MOP.pm line 116<br />
&nbsp; &nbsp; &nbsp; &nbsp; Class::MOP::load_first_existing_class(&#8216;</span>Catalyst<span class="sy0">::</span><span class="me2">Engine</span><span class="sy0">::</span><span class="me2">HTTP</span><span class="sy0">::</span><span class="me2">Restarter</span><span class="st_h">&#8216;) called at /usr/lib/perl5/Class/MOP.pm line 121<br />
&nbsp; &nbsp; &nbsp; &nbsp; Class::MOP::load_class(&#8216;</span>Catalyst<span class="sy0">::</span><span class="me2">Engine</span><span class="sy0">::</span><span class="me2">HTTP</span><span class="sy0">::</span><span class="me2">Restarter</span><span class="st_h">&#8216;) called at /usr/share/perl5/Catalyst.pm line 2634<br />
&nbsp; &nbsp; &nbsp; &nbsp; Catalyst::setup_engine(&#8216;</span>LolCatalyst<span class="sy0">::</span><span class="me2">Lite</span><span class="st_h">&#8216;, undef) called at /usr/share/perl5/Catalyst.pm line 1081<br />
&nbsp; &nbsp; &nbsp; &nbsp; Catalyst::setup(&#8216;</span>LolCatalyst<span class="sy0">::</span><span class="me2">Lite</span><span class="st_h">&#8216;) called at /home/jason/catalyst-book-code/Chapter_3/LolCatalyst-Lite/script/../lib/LolCatalyst/Lite.pm line 34<br />
&nbsp; &nbsp; &nbsp; &nbsp; require LolCatalyst/Lite.pm called at script/lolcatalyst_lite_server.pl line 55<br />
Compilation failed in require at script/lolcatalyst_lite_server.pl line 55.</span></div>
<p>The problem is that Catalyst::Engine::HTTP::Restarter within Catalyst::Engine was replaced by Catalyst::Restarter within the Catalyst::Devel package.   How to fix your application to use the updated development web server?  Very easy.  Rerun catalyst.pl with the &#8220;-scripts&#8221;, to rebuild just the scripts in the script directory, and &#8220;-force&#8221; to overwrite any files therein:</p>
<div class="perl dean_ch">jason<span class="re0">@catalyst</span><span class="sy0">:~/</span>catalyst<span class="sy0">-</span>book<span class="sy0">-</span>code<span class="sy0">/</span>Chapter_3$ catalyst<span class="sy0">.</span>pl <span class="sy0">-</span>scripts <span class="sy0">-</span>force LolCatalyst<span class="sy0">::</span><span class="me2">Lite</span><br />
&nbsp;<a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_cgi.pl&quot;</span><br />
created <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_cgi.pl&quot;</span><br />
&nbsp;<a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_fastcgi.pl&quot;</span><br />
created <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_fastcgi.pl&quot;</span><br />
&nbsp;<a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_server.pl&quot;</span><br />
created <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_server.pl&quot;</span><br />
&nbsp;<a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_test.pl&quot;</span><br />
created <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_test.pl&quot;</span><br />
&nbsp;<a href="http://perldoc.perl.org/functions/exists.html"><span class="kw3">exists</span></a> <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_create.pl&quot;</span><br />
created <span class="st0">&quot;LolCatalyst-Lite/script/lolcatalyst_lite_create.pl&quot;</span></div>
<p>If you&#8217;re interested in learning the Catalyst Web Framework (Perl based), I highly recommend <a href="http://www.amazon.com/gp/product/1430223650?ie=UTF8&#038;tag=froebe-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=1430223650">The Definitive Guide to Catalyst: Writing Extensible, Scalable and Maintainable Perl&ndash;Based Web Applications</a><img src="http://www.assoc-amazon.com/e/ir?t=froebe-20&#038;l=as2&#038;o=1&#038;a=1430223650" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2010/05/16/howto-unable-to-start-catalyst-web-applications-using-the-built-in-development-server-we-have-the-answer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Get it here! Perl DBD::Sybase 1.09.01 for Active State Perl 5.10 and 5.8 on Windows XP/Vista/7 32bit</title>
		<link>http://froebe.net/blog/2010/03/09/get-it-here-perl-dbdsybase-1-09-for-active-state-perl-5-10-and-5-8-on-windows-xpvista7-32bit/</link>
		<comments>http://froebe.net/blog/2010/03/09/get-it-here-perl-dbdsybase-1-09-for-active-state-perl-5-10-and-5-8-on-windows-xpvista7-32bit/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 22:27:48 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[15.5]]></category>
		<category><![CDATA[32 bit]]></category>
		<category><![CDATA[active state]]></category>
		<category><![CDATA[activestate]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[openclient]]></category>
		<category><![CDATA[peppler]]></category>
		<category><![CDATA[perl 5.10]]></category>
		<category><![CDATA[perl 5.8]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows 7]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1223</guid>
		<description><![CDATA[Assuming that you installed Sybase OpenClient 15.5 from the 15.5 PC Client: Install ActiveState Perl from http://www.activestate.com (free) and install DBI if it isn’t already installed.  It should be but you never know… Start -&#62; ActiveState Perl -&#62; Perl Package Manager install DBI exit Now, the easy part.  Install the DBD::Sybase 1.09.01 PPM: download DBD::Sybase [...]]]></description>
			<content:encoded><![CDATA[<p>Assuming that you installed <a href="http://www.sybase.com/detail?id=1037407">Sybase OpenClient 15.5</a> from the 15.5 PC Client:</p>
<p>Install ActiveState Perl from <a href="http://www.activestate.com%c2%a0/">http://www.activestate.com</a> (free) and install DBI if it isn’t already installed.  It should be but  you never know…</p>
<ol>
<li>Start -&gt; ActiveState Perl -&gt; Perl Package Manager</li>
<li>install DBI</li>
<li>exit<a href="http://www.perl.org"><img class="alignright size-full wp-image-1207" title="perl" src="http://froebe.net/blog/wp-content/uploads/2010/02/perl.jpeg" alt="" width="279" height="303" /></a></li>
</ol>
<p>Now, the easy part.  Install the <a href="http://www.froebe.net/attachments/DBD-Sybase-1.09.01.zip">DBD::Sybase</a> 1.09.01 PPM:</p>
<ol>
<li>download <a title="DBD-Sybase-1.09.zip" href="http://www.froebe.net/attachments/DBD-Sybase-1.09.01.zip">DBD::Sybase  1.09.01 PPM</a></li>
<li>extract zip file to temporary directory (e.g. c:\test)</li>
<li>Start -&gt; Run -&gt; cmd.exe (as Administrator if Vista or Windows  7)</li>
<li>cd \test</li>
<li>ppm  install DBD-Sybase.ppd</li>
<li>exit</li>
</ol>
<p>That’s it <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>It should automatically install the DBD::Sybase for Perl 5.8 or 5.10 depending on which version of Active State Perl you have installed.</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2010/03/09/get-it-here-perl-dbdsybase-1-09-for-active-state-perl-5-10-and-5-8-on-windows-xpvista7-32bit/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Get it here! Perl DBD::Sybase 1.09 for Active State Perl 5.10 on Windows XP/Vista/7 32bit</title>
		<link>http://froebe.net/blog/2010/02/17/get-it-here-perl-dbdsybase-1-09-for-active-state-perl-5-10-on-windows-xpvista7-32bit/</link>
		<comments>http://froebe.net/blog/2010/02/17/get-it-here-perl-dbdsybase-1-09-for-active-state-perl-5-10-on-windows-xpvista7-32bit/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 02:05:03 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[ASE]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[DBI]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[15.5]]></category>
		<category><![CDATA[32 bit]]></category>
		<category><![CDATA[active state]]></category>
		<category><![CDATA[activestate]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[openclient]]></category>
		<category><![CDATA[peppler]]></category>
		<category><![CDATA[vista]]></category>
		<category><![CDATA[windows 7]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1206</guid>
		<description><![CDATA[Assuming that you installed Sybase OpenClient 15.5 from the 15.5 PC Client: Install ActiveState Perl from http://www.activestate.com (free) and install DBI if it isn&#8217;t already installed.  It should be but you never know&#8230; Start -&#62; ActiveState Perl -&#62; Perl Package Manager install DBI exit Now, the easy part.  Install the DBD::Sybase 1.09 PPM: download DBD::Sybase [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>Assuming that you installed <a href="http://www.sybase.com/detail?id=1037407">Sybase OpenClient 15.5</a> from the 15.5 PC Client:</p>
<p>Install ActiveState Perl from <a href="http://www.activestate.com%c2%a0/">http://www.activestate.com</a> (free) and install DBI if it isn&#8217;t already installed.  It should be but you never know&#8230;</p>
<ol>
<li>Start -&gt; ActiveState Perl -&gt; Perl Package Manager<a href="http://www.perl.org"><img class="alignright size-thumbnail wp-image-1207" title="perl" src="http://froebe.net/blog/wp-content/uploads/2010/02/perl-150x150.jpg" alt="" width="150" height="150" /></a></li>
<li>install DBI</li>
<li>exit</li>
</ol>
<p>Now, the easy part.  Install the <a href="http://search.cpan.org/~mewp/DBD-Sybase/Sybase.pm">DBD::Sybase</a> 1.09 PPM:</p>
<ol>
<li>download <a title="DBD-Sybase-1.09.zip" href="http://www.froebe.net/attachments/DBD-Sybase-1.09.zip">DBD::Sybase 1.09 PPM</a></li>
<li>extract zip file to temporary directory (e.g. c:\test)</li>
<li>Start -&gt; Run -&gt; cmd.exe (as Administrator if Vista or Windows 7)</li>
<li>cd \test</li>
<li>ppm  install DBD-Sybase.ppd</li>
<li>exit</li>
</ol>
<p>That’s it <img src="../wp-includes/images/smilies/icon_smile.gif" alt=":)" /></p>
<div id="attachment_560" class="wp-caption aligncenter" style="width: 160px"><a href="http://www.sybase.com"><img class="size-thumbnail wp-image-560" title="Sybase, Inc." src="http://froebe.net/blog/wp-content/uploads/2008/07/sybase-150x74.png" alt="" width="150" height="74" /></a><p class="wp-caption-text">Sybase</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2010/02/17/get-it-here-perl-dbdsybase-1-09-for-active-state-perl-5-10-on-windows-xpvista7-32bit/feed/</wfw:commentRss>
		<slash:comments>3</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>Developing games with Perl and SDL</title>
		<link>http://froebe.net/blog/2009/09/12/developing-games-with-perl-and-sdl/</link>
		<comments>http://froebe.net/blog/2009/09/12/developing-games-with-perl-and-sdl/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 19:09:41 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[directx]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[sdl]]></category>
		<category><![CDATA[simple directmedia library]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1124</guid>
		<description><![CDATA[Andy Bakun over at Ars Technica wrote an excellent &#8220;HowTo&#8221; on writing games with Perl and the Simple DirectMedia Library: Developing games with Perl and SDL Get ready to dive into game development! Ars explores the art of SDL game programming with Perl. A dynamic, high-level scripting language and powerful open source SDL bindings make [...]]]></description>
			<content:encoded><![CDATA[<p>Andy Bakun over at Ars Technica wrote an excellent &#8220;HowTo&#8221; on writing games with Perl and the Simple DirectMedia Library:</p>
<blockquote>
<h2>Developing games with Perl and SDL</h2>
<p><a href="http://arstechnica.com/gaming/news/2006/02/games-perl.ars"><img class="alignright size-full wp-image-1125" title="ars technica" src="http://froebe.net/blog/wp-content/uploads/2009/09/arstechnica.png" alt="ars technica" width="120" height="90" /></a>Get ready to dive into game development! Ars explores the art of SDL game programming with Perl. A dynamic, high-level scripting language and powerful open source SDL bindings make it possible to produce sophisticated games without a lot of effort or overhead.<br />
By    <a href="http://arstechnica.com/authors/ohrmazd/">Andy Bakun</a> | Last updated <abbr title="2006-02-14T21:00:00-06:00">February 14, 2006  9:00 PM CT</abbr></p>
<h2>What is SDL_perl?</h2>
<p><a href="http://sdl.perl.org/">SDL_Perl</a> is a perl interface to the  <a href="http://www.libsdl.org/">Simple DirectMedia Library</a>.  It is composed of a  both a XS wrapper to the SDL libraries and a series of Perl modules that export SDL functionality in an object-oriented fashion.<br />
One of the biggest benefits of using SDL is that it allows portable media applications to be written without having to be concerned with specific implmentations of media libraries for each target platform. Bringing Perl into the picture takes the portability one step further, allowing media-rich applications to be written in a high-level language that can be targeted to a number of platforms. While programming using SDL requires knowledge of C and access to a C compiler, using SDL_perl does not. This greatly decreases the amount of time it takes to get something up on the screen and working.</p>
<p><a href="http://arstechnica.com/gaming/news/2006/02/games-perl.ars">Read more</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/09/12/developing-games-with-perl-and-sdl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Source code for scraping the website of Too Jewish Radio program to create two RSS feeds (audio podcast)</title>
		<link>http://froebe.net/blog/2009/07/20/source-code-for-scraping-the-website-of-too-jewish-radio-program-to-create-two-rss-feeds-audio-podcast/</link>
		<comments>http://froebe.net/blog/2009/07/20/source-code-for-scraping-the-website-of-too-jewish-radio-program-to-create-two-rss-feeds-audio-podcast/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 17:19:27 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Podcast]]></category>
		<category><![CDATA[radio program]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[spider]]></category>
		<category><![CDATA[too jewish]]></category>
		<category><![CDATA[web scraping]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1090</guid>
		<description><![CDATA[Many of you have asked me for the source code of the Perl application I wrote for creating the two rss feeds ( All Episodes &#038; Last 10 Episodes ) for the Too Jewish Radio program. Well, here ya go! Keep in mind that it was written quickly and really doesn&#8217;t have much in the [...]]]></description>
			<content:encoded><![CDATA[<p>Many of you have asked me for the source code of the Perl application I wrote for creating the two rss feeds ( <a href="http://www.froebe.net/rss/too_jewish_full.rss">All Episodes</a> &#038; <a href="http://www.froebe.net/rss/too_jewish_recent.rss">Last 10 Episodes</a> ) for the Too Jewish Radio program.  Well, here ya go!  Keep in mind that it was written quickly and really doesn&#8217;t have much in the line of robustness (no real error checking code, etc).<br />
<a href="http://www.toojewishradio.com/"><img src="http://www.froebe.net/images/TooJewishlogo_color.png" alt="" /></a></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> utf8<span class="sy0">;</span></p>
<p><span class="kw2">use</span> Config<span class="sy0">::</span><span class="me2">Simple</span><span class="sy0">;</span><br />
<span class="kw2">use</span> Date<span class="sy0">::</span><span class="me2">Manip</span> <a href="http://perldoc.perl.org/functions/qw.html"><span class="kw3">qw</span></a><span class="br0">&#40;</span> ParseDate UnixDate <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> LWP<span class="sy0">::</span><span class="me2">Simple</span><span class="sy0">;</span><br />
<span class="kw2">use</span> Net<span class="sy0">::</span><span class="me2">FTP</span><span class="sy0">;</span><br />
<span class="kw2">use</span> XML<span class="sy0">::</span><span class="me2">LibXML</span><span class="sy0">;</span><br />
<span class="kw2">use</span> XML<span class="sy0">::</span><span class="me2">RSS</span><span class="sy0">;</span><br />
<span class="kw2">use</span> URI<span class="sy0">;</span></p>
<p><span class="kw2">use</span> vars <a href="http://perldoc.perl.org/functions/qw.html"><span class="kw3">qw</span></a><span class="br0">&#40;</span> <span class="re0">$opt_h</span> <span class="re0">$opt_n</span> <span class="re0">$opt_o</span> <span class="re0">$opt_u</span> <span class="re0">$opt_c</span> <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw2">sub</span> print_usage <span class="br0">&#123;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;-&quot;</span>x40 <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</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; &quot;</span>x10 <span class="sy0">.</span> <span class="st0">&quot;too_jewish.pl<span class="es0">\n</span>&quot;</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;-&quot;</span>x40 <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</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; &quot;</span>x4 <span class="sy0">.</span> <span class="st0">&quot;-n [# episodes] : Number of episodes to list in the RSS feed<span class="es0">\n</span>&quot;</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; &quot;</span>x4 <span class="sy0">.</span> <span class="st0">&quot;-o [filename] : Save RSS feed to file<span class="es0">\n</span>&quot;</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; &quot;</span>x4 <span class="sy0">.</span> <span class="st0">&quot;-u &nbsp; &nbsp; : Upload RSS feed to ftp server<span class="es0">\n</span>&quot;</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; &quot;</span>x4 <span class="sy0">.</span> <span class="st0">&quot;-c [cfg filename]: Read configuration from filename<span class="es0">\n</span>&quot;</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; &quot;</span>x4 <span class="sy0">.</span> <span class="st0">&quot;-h &nbsp; &nbsp; : Print help<span class="es0">\n</span>&quot;</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;-&quot;</span>x40 <span class="sy0">.</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> format_W3CDTF_date <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$orig_date</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; <span class="kw1">my</span> <span class="re0">$w3cdtf_format</span> <span class="sy0">=</span> <span class="st0">&quot;%Y-%m-%d&quot;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$tmp_date</span> <span class="sy0">=</span> ParseDate<span class="br0">&#40;</span><span class="re0">$orig_date</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$tmp_date</span> <span class="sy0">=</span> UnixDate<span class="br0">&#40;</span><span class="re0">$tmp_date</span><span class="sy0">,</span> <span class="re0">$w3cdtf_format</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <a href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <span class="re0">$tmp_date</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> get_episode_data <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$num_episodes</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; <span class="kw1">my</span> <span class="re0">$episode_data_ref</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="co1"># Set up the parser, and set it to recover</span><br />
&nbsp; <span class="co1"># from errors so that it can handle broken</span><br />
&nbsp; <span class="co1"># HTML</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$parser</span> <span class="sy0">=</span> XML<span class="sy0">::</span><span class="me2">LibXML</span><span class="sy0">-&gt;</span><span class="me1">new</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$parser</span><span class="sy0">-&gt;</span><span class="me1">recover</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="co1"># Parse the page into a DOM tree structure</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$url</span> <span class="sy0">=</span> <span class="st_h">&#8216;http://www.toojewishradio.com/too_jewish_shows.htm&#8217;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$data</span> <span class="sy0">=</span> get<span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span> <span class="kw1">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span class="kw3">die</span></a> <span class="co5">$!</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">$doc</span> <span class="sy0">=</span> <span class="re0">$parser</span><span class="sy0">-&gt;</span><span class="me1">parse_html_string</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="co1"># Extract the table rows (as an</span><br />
&nbsp; <span class="co1"># array of referrences to DOM nodes)</span><br />
&nbsp; <span class="kw1">my</span> <span class="re0">@table_rows</span> <span class="sy0">=</span> <span class="re0">$doc</span><span class="sy0">-&gt;</span><span class="me1">findnodes</span><span class="br0">&#40;</span> <a href="http://perldoc.perl.org/functions/q.html"><span class="kw3">q</span></a><span class="br0">&#123;</span> <span class="sy0">/</span>html<span class="sy0">/</span>body<span class="sy0">/</span>table<span class="sy0">/</span><a href="http://perldoc.perl.org/functions/tr.html"><span class="kw3">tr</span></a> <span class="br0">&#125;</span> <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="re0">@table_rows</span> <span class="sy0">=</span> <span class="re0">@table_rows</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="sy0">..</span><span class="re0">$#table_rows</span><span class="br0">&#93;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">foreach</span> <span class="kw1">my</span> <span class="re0">$row</span> <span class="br0">&#40;</span><span class="re0">@table_rows</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$row_date</span> <span class="sy0">=</span> <span class="re0">$row</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="st_h">&#8216;string(td[1]//font/font)&#8217;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">next</span> <span class="kw1">if</span> <span class="re0">$row_date</span> <span class="sy0">=~</span> <span class="co2">/^\s*$/</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$mp3_file</span> <span class="sy0">=</span> <span class="re0">$row</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="st_h">&#8216;string(td[2]/font//a[1]/@href)&#8217;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">next</span> <span class="kw1">if</span> <span class="re0">$mp3_file</span> <span class="sy0">=~</span> <span class="co2">/^\s*$/</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$description</span> <span class="sy0">=</span> <span class="re0">$row</span><span class="sy0">-&gt;</span><span class="me1">find</span><span class="br0">&#40;</span><span class="st_h">&#8216;string(td[2]/font)&#8217;</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">value</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">next</span> <span class="kw1">if</span> <span class="re0">$description</span> <span class="sy0">=~</span> <span class="co2">/^\s*$/</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$description</span> <span class="sy0">=~</span> <span class="co2">s/\s+/ /g</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$description</span> <span class="sy0">=~</span> <span class="co2">s/^\s+//</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$description</span> <span class="sy0">=~</span> <span class="co2">s/\s+$//</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$abs_url_mp3</span> <span class="sy0">=</span> URI<span class="sy0">-&gt;</span><span class="me1">new</span><span class="br0">&#40;</span><span class="re0">$mp3_file</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">abs</span><span class="br0">&#40;</span><span class="re0">$url</span><span class="br0">&#41;</span><span class="sy0">-&gt;</span><span class="me1">as_string</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/push.html"><span class="kw3">push</span></a> <span class="re0">@$episode_data_ref</span><span class="sy0">,</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;pubDate&#8217;</span> <span class="sy0">=&gt;</span> <span class="re0">$row_date</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;description&#8217;</span> <span class="sy0">=&gt;</span> <span class="re0">$description</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;url&#8217;</span> <span class="sy0">=&gt;</span> <span class="re0">$abs_url_mp3</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</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">$num_episodes</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">@$episode_data_ref</span> <span class="sy0">=</span> <span class="re0">@$episode_data_ref</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="sy0">..</span><span class="re0">$num_episodes</span><span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <a href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <span class="re0">$episode_data_ref</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> create_rss_feed <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$episode_data_ref</span><span class="sy0">,</span> <span class="re0">$rss_filename</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">$rss</span> <span class="sy0">=</span> <span class="kw2">new</span> XML<span class="sy0">::</span><span class="me2">RSS</span> <span class="br0">&#40;</span>version <span class="sy0">=&gt;</span> <span class="st_h">&#8217;2.0&#8242;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="re0">$rss</span><span class="sy0">-&gt;</span><span class="me1">channel</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="st_h">&#8216;Too Jewish with Rabbi Cohon&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/link.html"><span class="kw3">link</span></a> &nbsp; &nbsp; &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">&#8216;http://www.toojewishradio.com&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; description &nbsp;<span class="sy0">=&gt;</span> <span class="st_h">&#8216;&quot;Too Jewish&quot; with Rabbi Sam Cohon and Friends plays every Sunday morning at 7:00 am on radio station KAPR 930 AM in Douglas, Bisbee, and Sierra Vista at 9:00 am, on KJAA 1240 AM in Globe at 9:00 am, and at 9:00 am on radio station KVOI AM 690 in Tucson.</p>
<p>&quot;Too Jewish&quot; is a lively and fast-paced show that highlights everything interesting in contemporary Jewish life and features music, arts, culture, comedy, and inspiration. &quot;Too Jewish&quot; is a blend of information, irreverence, and exploration of all things Jewish in the 21st century. &quot;Too Jewish&quot; makes Judaism accessible, interesting, and fun for listeners of all ages and backgrounds, and brings the best of Jewish experience vividly to life. But on &quot;Too Jewish&quot;, Rabbi Cohon also challenges accepted pieties and has fun with anything boring or inauthentic in the way Jews live today in the United States, Israel, and everywhere else.</p>
<p>Since its Tucson debut August 4, 2002, &quot;Too Jewish&quot; has featured such prominent guests as legendary singer and recording artist Neil Sedaka, Kinky Friedman, Elie Wiesel, comedian Lily Tomlin, folksinger Peter Yarrow, NPR Supreme Court Expert Nina Totenberg, Eve Ensler, U.S. Senator Russ Feingold, and many more!</p>
<p>Regular expert commentators of the &quot;Too Jewish&quot; maven section include Tom Price, an educator and former diplomat who offers unique insights into Jewish life around the world, and Amy Hirshberg Lederman, nationally syndicated columnist, who shares stories which speak to the heart of Jewish listeners. Comedy and musical selections drawn by Rabbi Cohon from the remarkable range of great Jewish material help make listening to &quot;Too Jewish&quot; an exciting and fun experience.&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; dc <span class="sy0">=&gt;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; date &nbsp; &nbsp; <span class="sy0">=&gt;</span> format_W3CDTF_date<span class="br0">&#40;</span><span class="st_h">&#8216;now&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; subject &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Jewish Radio&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; creator &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">&#8216;toojewishradio@yahoo.com&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; publisher &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">&#8216;toojewishradio@yahoo.com&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; rights &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">&#8216;All Rights Reserved, toojewishradio@yahoo.com&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; language &nbsp;<span class="sy0">=&gt;</span> <span class="st_h">&#8216;en-us&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; sync <span class="sy0">=&gt;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; updatePeriod &nbsp; <span class="sy0">=&gt;</span> <span class="st_h">&#8216;weekly&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; updateFrequency <span class="sy0">=&gt;</span> <span class="st_h">&#8217;1&#8242;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; updateBase &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> format_W3CDTF_date<span class="br0">&#40;</span><span class="st_h">&#8217;01/01/1901&#8242;</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; taxo <span class="sy0">=&gt;</span> <span class="br0">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;http://www.templeemanueltucson.org&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st_h">&#8216;http://www.toojewishradio.com/about_the_rabbi.htm&#8217;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#93;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="re0">$rss</span><span class="sy0">-&gt;</span><span class="me1">image</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; title <span class="sy0">=&gt;</span> <span class="st_h">&#8216;Too Jewish with Rabbi Cohon&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; url &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="st_h">&#8216;http://www.toojewishradio.com/Too%20Jewish%20logo_color.jpg&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/link.html"><span class="kw3">link</span></a> <span class="sy0">=&gt;</span> <span class="st_h">&#8216;http://www.templeemanueltucson.org&#8217;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; dc <span class="sy0">=&gt;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; creator <span class="sy0">=&gt;</span> <span class="st_h">&#8216;toojewishradio@yahoo.com&#8217;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; <span class="kw1">foreach</span> <span class="kw1">my</span> <span class="re0">$episode</span> <span class="br0">&#40;</span><span class="re0">@$episode_data_ref</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$rss</span><span class="sy0">-&gt;</span><span class="me1">add_item</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$episode</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>description<span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; enclosure &nbsp; &nbsp; <span class="sy0">=&gt;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; url &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$episode</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>url<span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; type <span class="sy0">=&gt;</span> <span class="st0">&quot;audio/mpeg&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; description <span class="sy0">=&gt;</span> <span class="re0">$episode</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>description<span class="br0">&#125;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; pubDate &nbsp; &nbsp; <span class="sy0">=&gt;</span> format_W3CDTF_date<span class="br0">&#40;</span> <span class="re0">$episode</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>pubDate<span class="br0">&#125;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</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">$rss_filename</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$rss</span><span class="sy0">-&gt;</span><span class="me1">save</span><span class="br0">&#40;</span><span class="re0">$rss_filename</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <a href="http://perldoc.perl.org/functions/return.html"><span class="kw3">return</span></a> <span class="re0">$rss</span><span class="sy0">-&gt;</span><span class="me1">as_string</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw2">sub</span> upload_rss_file <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">my</span> <span class="br0">&#40;</span><span class="re0">$ftp_server</span><span class="sy0">,</span> <span class="re0">$rss_filename</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">$ftp</span> <span class="sy0">=</span> Net<span class="sy0">::</span><span class="me2">FTP</span><span class="sy0">-&gt;</span><span class="me1">new</span><span class="br0">&#40;</span> <span class="re0">$ftp_server</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>server<span class="br0">&#125;</span><span class="sy0">,</span> Debug <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
&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;Cannot connect to $ftp_server-&gt;{server}: $@&quot;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$ftp</span><span class="sy0">-&gt;</span><span class="me1">login</span><span class="br0">&#40;</span> <span class="re0">$ftp_server</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>user<span class="br0">&#125;</span><span class="sy0">,</span> <span class="re0">$ftp_server</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>password<span class="br0">&#125;</span><span class="br0">&#41;</span><br />
&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;Cannot login &quot;</span><span class="sy0">,</span> <span class="re0">$ftp</span><span class="sy0">-&gt;</span><span class="me1">message</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$ftp</span><span class="sy0">-&gt;</span><span class="me1">cwd</span><span class="br0">&#40;</span><span class="re0">$ftp_server</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span>dir<span class="br0">&#125;</span><span class="br0">&#41;</span><br />
&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 change directory to $ftp_server-&gt;{dir}&quot;</span><span class="sy0">,</span> <span class="re0">$ftp</span><span class="sy0">-&gt;</span><span class="me1">message</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$ftp</span><span class="sy0">-&gt;</span><span class="me1">put</span><span class="br0">&#40;</span><span class="re0">$rss_filename</span><span class="br0">&#41;</span><br />
&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;Cannot upload $rss_filename&quot;</span><span class="sy0">,</span> <span class="re0">$ftp</span><span class="sy0">-&gt;</span><span class="me1">message</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$ftp</span><span class="sy0">-&gt;</span><span class="me1">quit</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw1">my</span> <span class="re0">$num_episodes</span><span class="sy0">;</span><br />
<span class="kw1">my</span> <span class="re0">$ftp_server</span><span class="sy0">;</span><br />
<span class="kw1">my</span> <span class="re0">$rss_filename</span><span class="sy0">;</span><br />
<span class="kw1">my</span> <span class="re0">$upload</span><span class="sy0">;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span>getopts<span class="br0">&#40;</span><span class="st_h">&#8216;hc:n:o:u&#8217;</span><span class="br0">&#41;</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">$opt_h</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; print_usage<span class="sy0">;</span><br />
&nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/exit.html"><span class="kw3">exit</span></a><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">$opt_n</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$opt_n</span> <span class="sy0">=~</span> <span class="co2">/^[[:digit:]]+$/</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$num_episodes</span> <span class="sy0">=</span> <span class="re0">$opt_n</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$opt_o</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$rss_filename</span> <span class="sy0">=</span> <span class="re0">$opt_o</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">$opt_u</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$upload</span> <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$cfg_filename</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$opt_c</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">-</span>f <span class="re0">$opt_c</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$cfg_filename</span> <span class="sy0">=</span> <span class="re0">$opt_c</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="re0">$cfg_filename</span> <span class="sy0">=</span> <span class="st_h">&#8216;.too_jewish.ini&#8217;</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">$cfg</span> <span class="sy0">=</span> <span class="kw2">new</span> Config<span class="sy0">::</span><span class="me2">Simple</span><span class="br0">&#40;</span><span class="re0">$cfg_filename</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">$cfg</span> <span class="sy0">&amp;&amp;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_server&#8217;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_user&#8217;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_password&#8217;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_dir&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="re0">$ftp_server</span> <span class="sy0">=</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; server &nbsp; <span class="sy0">=&gt;</span> <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_server&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; user &nbsp; &nbsp; <span class="sy0">=&gt;</span> <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_user&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; password &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_password&#8217;</span><span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; dir &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">=&gt;</span> <span class="re0">$cfg</span><span class="sy0">-&gt;</span><span class="me1">param</span><span class="br0">&#40;</span><span class="st_h">&#8216;RSS.ftp_dir&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</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; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;Configuration file <span class="es0">\&quot;</span>$cfg_filename<span class="es0">\&quot;</span> does not contain a valid configuration!<span class="es0">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/exit.html"><span class="kw3">exit</span></a><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p><span class="kw1">my</span> <span class="re0">$rss_string</span> <span class="sy0">=</span> create_rss_feed<span class="br0">&#40;</span> get_episode_data<span class="br0">&#40;</span><span class="re0">$num_episodes</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$rss_filename</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">$rss_filename</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$upload</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">-</span>f <span class="re0">$rss_filename</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; upload_rss_file<span class="br0">&#40;</span><span class="re0">$ftp_server</span><span class="sy0">,</span> <span class="re0">$rss_filename</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span class="kw3">print</span></a> <span class="st0">&quot;$rss_string<span class="es0">\n</span>&quot;</span> <span class="kw1">unless</span> <span class="re0">$rss_filename</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/07/20/source-code-for-scraping-the-website-of-too-jewish-radio-program-to-create-two-rss-feeds-audio-podcast/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Can&#8217;t find a working RSS feed for the &#8220;Too Jewish with Rabbi Cohon&#8221; podcast?  Here is a working RSS feed that is updated every Monday morning!</title>
		<link>http://froebe.net/blog/2009/07/07/cant-find-a-working-rss-feed-for-the-too-jewish-with-rabbi-cohon-podcast-here-is-a-working-rss-feed-that-is-updated-every-monday-morning/</link>
		<comments>http://froebe.net/blog/2009/07/07/cant-find-a-working-rss-feed-for-the-too-jewish-with-rabbi-cohon-podcast-here-is-a-working-rss-feed-that-is-updated-every-monday-morning/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 01:57:33 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Arizona]]></category>
		<category><![CDATA[comedy]]></category>
		<category><![CDATA[Jewish]]></category>
		<category><![CDATA[Judaica]]></category>
		<category><![CDATA[Rabbi Sam Cohon]]></category>
		<category><![CDATA[reform]]></category>
		<category><![CDATA[Reform Jewish synagogue]]></category>
		<category><![CDATA[religious]]></category>
		<category><![CDATA[rss feed]]></category>
		<category><![CDATA[Temple Emanu-El]]></category>
		<category><![CDATA[Too Jewish with Rabbi Sam Cohon & Friends]]></category>
		<category><![CDATA[Tucson]]></category>
		<category><![CDATA[xml::rss]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1088</guid>
		<description><![CDATA[A long time ago when I used iTunes on my WinXP laptop I was able to subscribe to the Too Jewish with Rabbi Sam Cohon &#38; Friends podcast through the iTunes Store.  Since my main desktop runs Ubuntu Linux 9.04 and the RhythmBox Music Player is unable to retrieve podcast from the iTunes Store, I [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.toojewishradio.com/"><img src="http://www.froebe.net/images/TooJewishlogo_color.png" alt="" width="415" height="151" /></a></p>
<p>A long time ago when I used <a href="http://itunes.com">iTunes</a> on my WinXP laptop I was able to subscribe to the <a href="http://www.toojewishradio.com/">Too Jewish with Rabbi Sam Cohon &amp; Friends</a> podcast through the iTunes Store.  Since my main desktop runs <a href="http://www.ubuntu.com">Ubuntu Linux 9.04</a> and the <a href="http://projects.gnome.org/rhythmbox/">RhythmBox Music Player</a> is unable to retrieve podcast from the iTunes Store, I was at a loss as to how to listen to the podcast.</p>
<p>I sent numerous emails to the webmasters at <span style="font-family: Arial,Helvetica;"><a href="mailto:toojewishradio@yahoo.com">toojewishradio@yahoo.com</a></span> requesting a RSS feed of the podcast to no avail.  So&#8230; I wrote a small <a href="http://www.perl.org">Perl</a> application to create two RSS feeds:</p>
<ul>
<li>All Episodes <a href="http://www.froebe.net/rss/too_jewish_full.rss"><img src="http://www.froebe.net/images/rssbutton.gif" alt="" /></a></li>
<li>Last 10 Episodes <a href="http://www.froebe.net/rss/too_jewish_recent.rss"><img src="http://www.froebe.net/images/rssbutton.gif" alt="" /></a></li>
</ul>
<p>Please note that I&#8217;m only generating and hosting the RSS feeds and <strong>NOT</strong> the podcast files.  The podcast is a product of <strong><span style="font-family: Arial,Helvetica;"><a href="http://www.templeemanueltucson.org/"><strong>Temple Emanu-El</strong></a><strong>.</strong></span></strong><br />
<strong>Update:</strong> The source code is available at  <a title="Permanent Link to Source code for scraping the website of Too Jewish Radio program to create two RSS feeds (audio podcast)" rel="bookmark" href="../2009/07/20/source-code-for-scraping-the-website-of-too-jewish-radio-program-to-create-two-rss-feeds-audio-podcast/">Source code for scraping the website of Too Jewish Radio program to create two RSS feeds (audio podcast) </a></p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/07/07/cant-find-a-working-rss-feed-for-the-too-jewish-with-rabbi-cohon-podcast-here-is-a-working-rss-feed-that-is-updated-every-monday-morning/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Perl module Flickr::Simple2 v0.03 for the Flickr API released!</title>
		<link>http://froebe.net/blog/2009/05/13/perl-module-flickrsimple2-v003-for-the-flickr-api-released/</link>
		<comments>http://froebe.net/blog/2009/05/13/perl-module-flickrsimple2-v003-for-the-flickr-api-released/#comments</comments>
		<pubDate>Wed, 13 May 2009 16:41:26 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[flickr api]]></category>
		<category><![CDATA[flickr::simple2]]></category>
		<category><![CDATA[PAUSE]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1072</guid>
		<description><![CDATA[I just uploaded the Perl module Flickr::Simple2 version 0.03 to CPAN (PAUSE) so it might be a few minutes/hours before it shows up in the CPAN mirrors. Revision history for Perl extension Flickr::Simple2. 0.03  Wed May 13 11:18:00 2009 - significant changes to the API to make more methods of the Flickr API available. - [...]]]></description>
			<content:encoded><![CDATA[<p>I just uploaded the Perl module <a href="http://search.cpan.org/~jfroebe/Flickr-Simple2/lib/Flickr/Simple2.pm">Flickr::Simple2</a> version 0.03 to <a href="http://www.cpan.org">CPAN</a> (PAUSE) so it might be a few minutes/hours before it shows up in the CPAN mirrors.</p>
<p>Revision history for Perl extension <a href="http://search.cpan.org/~jfroebe/Flickr-Simple2/lib/Flickr/Simple2.pm">Flickr::Simple2</a>.</p>
<p>0.03  Wed May 13 11:18:00 2009<br />
- significant changes to the API to make more methods of the Flickr API available.<br />
- using Iterator::Simple so we can retrieve one photo at a time and internalize the handling of Flickr Photo *pages*<br />
0.02  Initial CPAN release<br />
0.01  Thu Feb 12 11:33:35 2009<br />
- original version; created by h2xs 1.23 with options<br />
-XA -n Flickr::Simple2</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/05/13/perl-module-flickrsimple2-v003-for-the-flickr-api-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Are you receiving the &#8220;Useless localization of scalar assignment&#8221; error when using Exception::Class::TCF with Perl 5.10?  I have a fix for you!</title>
		<link>http://froebe.net/blog/2009/04/29/are-you-receiving-the-useless-localization-of-scalar-assignment-error-when-using-exceptionclasstcf-with-perl-510-i-have-a-fix-for-you/</link>
		<comments>http://froebe.net/blog/2009/04/29/are-you-receiving-the-useless-localization-of-scalar-assignment-error-when-using-exceptionclasstcf-with-perl-510-i-have-a-fix-for-you/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 17:03:37 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[exception::class::tcf]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[perl 5.10]]></category>
		<category><![CDATA[Rutger Vos]]></category>
		<category><![CDATA[Torsten Ekedahl]]></category>
		<category><![CDATA[workaround]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1056</guid>
		<description><![CDATA[The following is a patch for bug 45563 in Exception::Class::TCF: Useless localization of scalar assignment at Exception-Class-TCF/lib/Exception/Class/TCF.pm line 255. Index: lib/Exception/Class/TCF.pm =================================================================== &#8212; lib/Exception/Class/TCF.pm (revision 83) +++ lib/Exception/Class/TCF.pm (working copy) @@ -251,8 +251,11 @@ my($block,@catches) = @_; my($exc,@args,$res); &#38;$pushFrame; - $HANDLE_WARN &#38;&#38; - local ( $SIG{&#8216;__WARN__&#8217;} = sub { throw Exception::Class::TCF::Warning @_; } ); + [...]]]></description>
			<content:encoded><![CDATA[<h3>The following is a patch for <a href="http://rt.cpan.org/Public/Dist/Display.html?Name=Exception-Class-TCF">bug 45563</a> in <a href="http://search.cpan.org/~rvosa/Exception-Class-TCF/lib/Exception/Class/TCF.pm">Exception::Class::TCF</a>:</h3>
<h4><a href="https://rt.cpan.org/Ticket/Display.html?id=45563">Useless localization of scalar assignment at Exception-Class-TCF/lib/Exception/Class/TCF.pm line 255</a>.</h4>
<p>Index: lib/Exception/Class/TCF.pm<br />
===================================================================<br />
&#8212; lib/Exception/Class/TCF.pm	(revision 83)<br />
+++ lib/Exception/Class/TCF.pm	(working copy)<br />
@@ -251,8 +251,11 @@<br />
my($block,@catches) = @_;<br />
my($exc,@args,$res);<br />
&amp;$pushFrame;<br />
-    $HANDLE_WARN &amp;&amp;<br />
-      local ( $SIG{&#8216;__WARN__&#8217;} =  sub { throw Exception::Class::TCF::Warning @_;  } );<br />
+<br />
+    if ($HANDLE_WARN) {<br />
+      local ( $SIG{&#8216;__WARN__&#8217;} ) =  sub { throw Exception::Class::TCF::Warning @_;  };<br />
+    }<br />
+<br />
$dTHROWING = 0;<br />
$res = eval { &amp;$block() };<br />
$exc = $EXCEPTION;</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/04/29/are-you-receiving-the-useless-localization-of-scalar-assignment-error-when-using-exceptionclasstcf-with-perl-510-i-have-a-fix-for-you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excellent Training Videos from India&#8217;s National Programme of Technology Enhanced Learning (on YouTube)</title>
		<link>http://froebe.net/blog/2009/04/17/excellent-training-videos-from-indias-national-programme-of-technology-enhanced-learning-on-youtube/</link>
		<comments>http://froebe.net/blog/2009/04/17/excellent-training-videos-from-indias-national-programme-of-technology-enhanced-learning-on-youtube/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 17:42:52 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[How To]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[computer science]]></category>
		<category><![CDATA[india]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[National Programme of Technology Enhanced Learning]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[training videos]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=1052</guid>
		<description><![CDATA[India&#8217;s National Programme of Technology Enhanced Learning provides technical lectures from all seven Indian Institutes of Technology and Indian Institute of Science, Bangalore. The Video Courses are organised as PLAYLISTS under the following Categories: Core Sciences Civil Engineering Computer Science and Engineering Electrical Engineering Electronics and Communication Engineering Mechanical Engineering Lecture 21 PERL &#8211; Part [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>India&#8217;s <a href=" http://nptel.iitm.ac.in">National Programme of Technology Enhanced Learning</a> provides technical lectures from all seven Indian Institutes of Technology and Indian Institute of Science, Bangalore.</p>
<p>The Video Courses are organised as <a href="http://www.youtube.com/profile?user=nptelhrd&amp;view=playlists">PLAYLISTS</a> under the following Categories:</p>
<ol>
<li>Core Sciences</li>
<li>Civil Engineering</li>
<li>Computer Science and Engineering</li>
<li>Electrical Engineering</li>
<li>Electronics and Communication Engineering</li>
<li>Mechanical Engineering</li>
</ol>
</blockquote>
<p><a href="http://www.youtube.com/watch?v=1pVolaKhxVM&amp;feature=PlayList&amp;p=04D5787E247DC324&amp;index=20"><em>Lecture 21 PERL &#8211; Part I</em></a> from the <a href="http://www.youtube.com/view_play_list?p=04D5787E247DC324">Computer Science &amp; Engineering&#8217;s Internet Technologies course</a> is an excellent example of these training videos:<br />
<object width="425" height="344" data="http://www.youtube.com/v/1pVolaKhxVM&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/1pVolaKhxVM&amp;hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/04/17/excellent-training-videos-from-indias-national-programme-of-technology-enhanced-learning-on-youtube/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>First official release of Flickr::Simple2 to Perl&#8217;s CPAN repository :)</title>
		<link>http://froebe.net/blog/2009/03/11/first-official-release-of-flickrsimple2-to-perls-cpan-repository/</link>
		<comments>http://froebe.net/blog/2009/03/11/first-official-release-of-flickrsimple2-to-perls-cpan-repository/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 14:16:22 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[flickr::simple]]></category>
		<category><![CDATA[flickr::simple2]]></category>
		<category><![CDATA[XML::Simple]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=893</guid>
		<description><![CDATA[Flickr::Simple2 is an XML::Simple based Perl API to communicate with Flickr.  It is in the early phases of development… comments are welcome You will need to supply your own Flickr API key. I released version 0.02 to Perl&#8217;s CPAN repository this morning after several delays related to the birth of my son a week ago.  [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_859" class="wp-caption alignright" style="width: 108px"><a href="http://www.flickr.com"><img class="size-full wp-image-859" title="Flickr" src="http://froebe.net/blog/wp-content/uploads/2009/02/flickr_logo.png" alt="Flickr" width="98" height="26" /></a><p class="wp-caption-text">Flickr</p></div>
<p><a href="http://search.cpan.org/~jfroebe/Flickr-Simple2/lib/Flickr/Simple2.pm">Flickr::Simple2</a> is an XML::Simple based <a href="http://www.perl.org">Perl</a> API to communicate with <a href="http://www.flickr.com">Flickr</a>.  It is in the early phases of development… comments are welcome <img class="wp-smiley" src="../wp-includes/images/smilies/icon_smile.gif" alt=":)" /></p>
<p>You will need to supply your own <a href="http://www.flickr.com/services/api/keys/">Flickr API key</a>.</p>
<p>I released version 0.02 to <a href="http://search.cpan.org/">Perl&#8217;s CPAN repository</a> this morning after several delays related to the birth of my son a week ago.  As always, comments and constructive critism are welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/03/11/first-official-release-of-flickrsimple2-to-perls-cpan-repository/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Alpha test release of Flickr::Simple2</title>
		<link>http://froebe.net/blog/2009/02/17/alpha-test-release-of-flickrsimple2/</link>
		<comments>http://froebe.net/blog/2009/02/17/alpha-test-release-of-flickrsimple2/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 18:05:47 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Flickr]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[flickr api]]></category>
		<category><![CDATA[flickr::simple2]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=857</guid>
		<description><![CDATA[Flickr::Simple2 is an XML::Simple based Perl API to communicate with Flickr.  It is in the early phases of development&#8230; comments are welcome You will need to supply your own Flickr API key.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com"><img class="alignright size-full wp-image-859" title="Flickr" src="http://froebe.net/blog/wp-content/uploads/2009/02/flickr_logo.png" alt="Flickr" width="98" height="26" /></a><a href="http://www.froebe.net/attachments/Flickr-Simple2-0.01.tar.gz">Flickr::Simple2</a> is an XML::Simple based Perl API to communicate with Flickr.  It is in the early phases of development&#8230; comments are welcome <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>You will need to supply your own <a href="http://www.flickr.com/services/api/keys/">Flickr API key</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/02/17/alpha-test-release-of-flickrsimple2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FW:  Migration Migraines</title>
		<link>http://froebe.net/blog/2009/01/28/fw-migration-migraines/</link>
		<comments>http://froebe.net/blog/2009/01/28/fw-migration-migraines/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 20:00:07 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[ASE]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[IBM DB2]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac OSX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Sybase]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Adrian Bridgwater]]></category>
		<category><![CDATA[international sybase users group]]></category>
		<category><![CDATA[ISUG]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[perlmonger]]></category>
		<category><![CDATA[ZDNet]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=836</guid>
		<description><![CDATA[Migration migraines: the top seven DBA data headaches Posted by Adrian Bridgwater Once or twice a year I get to work with an excellent DBA pal from Illinois called Jason Froebe who describes himself as a, “Perlmonger capable of speaking fluent munchkin.” His personal blog is called Ramblings of a Geek, but I keep telling [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<div id="attachment_569" class="wp-caption alignright" style="width: 110px"><a href="http://community.zdnet.co.uk/blog/0,1000000567,10011988o-2000458459b,00.htm"><img class="size-thumbnail wp-image-569" title="Adrian Bridgwater" src="http://froebe.net/blog/wp-content/uploads/2008/07/adrianbridgwater.jpg" alt="Adrian Bridgwater" width="100" height="100" /></a><p class="wp-caption-text">Adrian Bridgwater</p></div>
<h3><em><a title="Migration migraines: the top seven DBA data headaches" rel="bookmark" href="http://community.zdnet.co.uk/blog/0,1000000567,10011988o-2000458459b,00.htm">Migration migraines: the top seven DBA data headaches</a></em></h3>
<p class="tags"><em>Posted by <a href="http://community.zdnet.co.uk/profile/0,1000000564,2000458459b,00.htm">Adrian Bridgwater</a></em></p>
<div class="blog_body"></div>
<p><em>Once or twice a year I get to work with an excellent DBA pal from Illinois called Jason Froebe who describes himself as a, “Perlmonger capable of speaking fluent munchkin.” His personal blog is called <a href="../">Ramblings of a Geek</a>, but I keep telling him he should rename it “Froebe’s Frontal Lobe”.</em></p>
<p><a title="Migration migraines: the top seven DBA data headaches" href="http://community.zdnet.co.uk/blog/0,1000000567,10011988o-2000458459b,00.htm">read more at ZDnet&#8230;</a></p></blockquote>
<p>The work that Adrian mentions is a last minute article for the International Sybase User&#8217;s Group that I wrote and he edited.  The benchmarking article that many people are waiting for is being held up by several groups giving their approval for the release of the material.</p>
<p>As always, it is a real pleasure to work with Adrian <img src='http://froebe.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/01/28/fw-migration-migraines/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why oh why is working with XML so bloomin&#8217; difficult in Perl?</title>
		<link>http://froebe.net/blog/2009/01/17/why-oh-why-is-working-with-xml-so-bloomin-difficult-in-perl/</link>
		<comments>http://froebe.net/blog/2009/01/17/why-oh-why-is-working-with-xml-so-bloomin-difficult-in-perl/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 03:51:31 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[perlmonks]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=832</guid>
		<description><![CDATA[I love perl, I really do. The problem is that I need to also work with XML as well. CPAN has numerous modules that work with XML to one degree or another. Producing XML is simple and easy. Reading or manipulating it involves loading the XML through a parser. The parsers will create a myriad [...]]]></description>
			<content:encoded><![CDATA[<p>I love perl, I really do. The problem is that I need to also work with XML as well. CPAN has numerous modules that work with XML to one degree or another.</p>
<p>Producing XML is simple and easy. Reading or manipulating it involves loading the XML through a parser. The parsers will create a myriad of hashes, arrays and the like but navigating them even with tools like XPath make you want to perform oral surgery on yourself using rusty tiddly winks.</p>
<p>So my question is this: Are there any XML parsers for Perl that are easy to use without having to deal with arbitrary hashes of hashes of hashes and &#8230;. (don&#8217;t forget the arrays)?</p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/01/17/why-oh-why-is-working-with-xml-so-bloomin-difficult-in-perl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Perl Review: Issue 5.1, Winter 2008 has been released!</title>
		<link>http://froebe.net/blog/2009/01/04/the-perl-review-issue-51-winter-2008-has-been-released/</link>
		<comments>http://froebe.net/blog/2009/01/04/the-perl-review-issue-51-winter-2008-has-been-released/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 17:06:07 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Alberto Simões]]></category>
		<category><![CDATA[brian d foy]]></category>
		<category><![CDATA[business expense]]></category>
		<category><![CDATA[camel]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[ezine]]></category>
		<category><![CDATA[factorial]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[José Castro]]></category>
		<category><![CDATA[magazine]]></category>
		<category><![CDATA[Nadim Khemir]]></category>
		<category><![CDATA[patching]]></category>
		<category><![CDATA[perl modules]]></category>
		<category><![CDATA[perl news]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[subscription]]></category>
		<category><![CDATA[tax]]></category>
		<category><![CDATA[The Perl Review]]></category>
		<category><![CDATA[tivo]]></category>
		<category><![CDATA[Yanick Champoux]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=791</guid>
		<description><![CDATA[brian d foy and crew release another amazing Perl Review magazine issue.  If you haven&#8217;t subscribed yet, please please do so, it is a treasure trove of information!  You can even claim the subscription on your 2009 taxes as a business expense.  How cool is that?!? Issue 5.1, Winter 2008 Surviving Your First Week of [...]]]></description>
			<content:encoded><![CDATA[<p>brian d foy and crew release another amazing <a href="http://www.theperlreview.com"><strong>Perl Review</strong> magazine</a> issue.  If you haven&#8217;t <a href="https://www.theperlreview.com/cgi-bin/subscribe.cgi">subscribed</a> yet, please please do so, it is a treasure trove of information!  You can even claim the <a href="https://www.theperlreview.com/cgi-bin/subscribe.cgi">subscription</a> on your 2009 taxes as a business expense.  How cool is that?!?</p>
<blockquote>
<h2 id="issue-header"><em>Issue 5.1, Winter 2008</em></h2>
<p class="article-title"><em><span class="article-title">Surviving Your First Week of Perl</span> (<a href="http://www.theperlreview.com/SamplePages/ThePerlReview-v5i1.p5.pdf">sample</a>)</em></p>
<div id="attachment_792" class="wp-caption alignright" style="width: 241px"><a href="http://www.theperlreview.com/"><img class="size-medium wp-image-792" title="The Perl Review" src="http://froebe.net/blog/wp-content/uploads/2009/01/v5i1-cover-medium-231x300.png" alt="Issue 5.1, Winter 2008" width="231" height="300" /></a><p class="wp-caption-text">Issue 5.1, Winter 2008</p></div>
<p class="article-title"><em><span class="article-author">José Castro</span></em></p>
<p class="article-title"><em><span class="article-title">Programming with CPAN.pm</span> (<a href="http://www.theperlreview.com/SamplePages/ThePerlReview-v5i1.p11.pdf">sample</a>)<br />
<span class="article-author">brian d foy</span></em></p>
<p class="article-title"><em><span class="article-title">CPAN Patching with Git</span> (<a href="http://www.theperlreview.com/SamplePages/ThePerlReview-v5i1.p18.pdf">sample</a>)<br />
<span class="article-author">Yanick Champoux</span></em></p>
<p class="article-title"><em><span class="article-title">Refactoring Factorial</span> (<a href="http://www.theperlreview.com/SamplePages/ThePerlReview-v5i1.p23.pdf">sample</a>)<br />
<span class="article-author">Alberto Simões</span></em></p>
<p class="article-title"><em><span class="article-title">Downloading From TiVo</span> (<a href="http://www.theperlreview.com/SamplePages/ThePerlReview-v5i1.p27.pdf">sample</a>)<br />
<span class="article-author">brian d foy</span></em>
</p>
<p class="article-more"><em>plus Commentary and Module Reviews by Nadim Khemir, Perl News, and more&#8230; </em></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2009/01/04/the-perl-review-issue-51-winter-2008-has-been-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

