<?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; playstation</title>
	<atom:link href="http://froebe.net/blog/index.php/tag/playstation/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>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>Rip a dvd with HandbrakeCLI on Ubuntu Linux 8.04 (Hardy Heron) for the Sony PS3 (mpeg4 / h.264)</title>
		<link>http://froebe.net/blog/2008/07/14/rip-a-dvd-with-handbrakecli-on-ubuntu-linux-804-hardy-heron-for-the-sony-ps3-mpeg4-h264/</link>
		<comments>http://froebe.net/blog/2008/07/14/rip-a-dvd-with-handbrakecli-on-ubuntu-linux-804-hardy-heron-for-the-sony-ps3-mpeg4-h264/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 02:45:18 +0000</pubDate>
		<dc:creator>Jason L Froebe</dc:creator>
				<category><![CDATA[How To]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS]]></category>
		<category><![CDATA[dvd]]></category>
		<category><![CDATA[dvd rip]]></category>
		<category><![CDATA[Gnome]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[handbrake]]></category>
		<category><![CDATA[handbrakecli]]></category>
		<category><![CDATA[make_ps3_hb.sh]]></category>
		<category><![CDATA[mediatomb]]></category>
		<category><![CDATA[playstation]]></category>
		<category><![CDATA[playstation 3]]></category>
		<category><![CDATA[ps3]]></category>
		<category><![CDATA[RippedWire]]></category>
		<category><![CDATA[ripping]]></category>
		<category><![CDATA[sony ps3]]></category>
		<category><![CDATA[sourceforge.net]]></category>
		<category><![CDATA[th3rmite]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://froebe.net/blog/?p=571</guid>
		<description><![CDATA[After much trial and error, I chose HandbrakeCLI for ripping a dvd to a h.264 mpeg4 file that I can play on my Sony Playstation 3 console. Please note that HandBrake does quite well on live action video but not so good on animation. % sudo aptitude install build-essential % sudo aptitude install zlib1g-dev jam [...]]]></description>
			<content:encoded><![CDATA[<p>After much trial and error, I chose <a href="http://handbrake.fr/">HandbrakeCLI</a> for ripping a dvd to a h.264 mpeg4 file that I can play on my <a href="http://www.amazon.com/gp/product/B000XGJH1O?ie=UTF8&amp;tag=froebe-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000XGJH1O">Sony Playstation 3 console</a>.  Please note that HandBrake does quite well on live action video but not so good on animation.</p>
<div class="bash dean_ch"><span class="sy0">%</span> <span class="kw2">sudo</span> <span class="kw2">aptitude</span> <span class="kw2">install</span> build-essential<br />
<span class="sy0">%</span> <span class="kw2">sudo</span> <span class="kw2">aptitude</span> <span class="kw2">install</span> zlib1g-dev jam yasm<br />
<span class="sy0">%</span> <span class="kw2">wget</span> http:<span class="sy0">//</span>handbrake.fr<span class="sy0">/</span>rotation.php?<span class="re2">file</span>=HandBrake-0.9.2.tar.gz<br />
<span class="sy0">%</span> <span class="kw2">tar</span> zxvf HandBrake-0.9.2.tar.gz<br />
<span class="sy0">%</span> <span class="kw3">cd</span> HandBrake<br />
<span class="sy0">%</span> .<span class="sy0">/</span>configure<br />
<span class="sy0">%</span> jam<br />
<span class="sy0">%</span> <span class="kw2">cp</span> HandBrakeCLI ..<span class="sy0">/</span>bin &nbsp;<span class="co0"># to copy the binary into the user&#8217;s bin dir</span></div>
<p>We need yasm installed to pick up any cpu extensions that our cpu supports.  For example: MMX MMXEXT SSE SSE2 3DNow!</p>
<p>Now that we have a working HandBrakeCLI binary built for our system (works for 32bit or 64bit depending on which system we built it on).</p>
<p>I wrote a very simple script that will rip the dvd (legal dvd rip btw) into a mp4 file, copy it to the media-server which will be picked up automatically by <a href="http://mediatomb.cc/">mediatomb</a>.</p>
<p>make_ps3_hb.sh:</p>
<div class="bash dean_ch"><span class="co0">#!/bin/bash</span></p>
<p><span class="co0"># make_ps3_hb.sh &lt;video_name .mp4&gt; [genre]</span></p>
<p><span class="kw2">nice</span> <span class="re5">-n</span> <span class="nu0">15</span> ~<span class="sy0">/</span>bin<span class="sy0">/</span>HandBrakeCLI <span class="re5">-i</span> <span class="sy0">/</span>dev<span class="sy0">/</span>dvd <span class="re5">-e</span> x264 <span class="re5">-b</span> <span class="nu0">1200</span> <span class="re5">-B</span> <span class="nu0">160</span> <span class="re5">-R</span> <span class="nu0">48</span> <span class="re5">-E</span> faac <span class="re5">-f</span> mp4 <span class="re5">-P</span>=<span class="nu0">16</span> <span class="re5">-x</span> <span class="re2">level</span>=<span class="nu0">41</span>:<span class="re2">subme</span>=<span class="nu0">5</span>:<span class="re2">me</span>=umh <span class="re5">-T</span> <span class="re5">-2</span> <span class="re5">-d</span> <span class="re5">-7</span> <span class="re5">-8</span> <span class="re5">-O</span> <span class="re5">&#8211;crop</span> <span class="re5">-m</span> <span class="re5">-N</span> eng <span class="re5">-o</span> <span class="st0">&quot;$1&quot;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-f</span> <span class="st0">&quot;$1&quot;</span> <span class="br0">&#93;</span><br />
<span class="kw1">then</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re4">$2</span> <span class="br0">&#93;</span><br />
&nbsp; <span class="kw1">then</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> copying <span class="re4">$1</span> to media-server <span class="sy0">/</span>home<span class="sy0">/</span>jason<span class="sy0">/</span>Videos<span class="sy0">/</span><span class="re4">$2</span><br />
&nbsp; &nbsp; <span class="kw2">scp</span> <span class="st0">&quot;$1&quot;</span> <span class="st0">&quot;jason@media-server:/home/jason/Videos/$2/$1&quot;</span> <span class="sy0">&amp;&amp;</span> <span class="kw2">rm</span> <span class="re5">-f</span> <span class="st0">&quot;$1&quot;</span><br />
&nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> copying <span class="re4">$1</span> to media-server <span class="sy0">/</span>home<span class="sy0">/</span>jason<span class="sy0">/</span>Videos<br />
&nbsp; &nbsp; <span class="kw2">scp</span> <span class="st0">&quot;$1&quot;</span> <span class="st0">&quot;jason@media-server:/home/jason/Videos/$1&quot;</span> <span class="sy0">&amp;&amp;</span> <span class="kw2">rm</span> <span class="re5">-f</span> <span class="st0">&quot;$1&quot;</span><br />
&nbsp; <span class="kw1">fi</span><br />
<span class="kw1">fi</span><span class="sy0">&lt;/</span>video_name<span class="sy0">&gt;</span></div>
<p><a href="http://handbrake.fr">Handbrake</a> documentation is available on the <a href="http://trac.handbrake.fr/wiki/HandBrakeGuide">Handbrake wiki website</a>.</p>
<p><strong>UPDATE</strong>: If you&#8217;re looking for a GUI front end for HandBrakeCLI on Linux, check out <a href="http://sourceforge.net/projects/rippedwire/">RippedWire</a> by <a href="http://sourceforge.net/users/th3rmite/">th3rmite</a>.</p>
<p><a href="http://froebe.net/blog/wp-content/uploads/2008/07/rippedwire.jpg"><img class="aligncenter size-medium wp-image-574" title="RippedWire" src="http://froebe.net/blog/wp-content/uploads/2008/07/rippedwire-269x300.jpg" alt="Screenshot: HandBrakeGTK 1.0.1 - Queue Tab" width="269" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://froebe.net/blog/2008/07/14/rip-a-dvd-with-handbrakecli-on-ubuntu-linux-804-hardy-heron-for-the-sony-ps3-mpeg4-h264/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

