<?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/"
	xmlns:georss="http://www.georss.org/georss" >

<channel>
	<title>Ogre &#187; ebooks</title>
	<atom:link href="http://rumsey.org/blog/tag/ebooks/feed/" rel="self" type="application/rss+xml" />
	<link>http://rumsey.org/blog</link>
	<description></description>
	<lastBuildDate>Sun, 06 Nov 2011 22:52:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Kindle DRM Removal Using SCons</title>
		<link>http://rumsey.org/blog/2010/02/kindle-drm-removal-using-scons/</link>
		<comments>http://rumsey.org/blog/2010/02/kindle-drm-removal-using-scons/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 22:14:26 +0000</pubDate>
		<dc:creator>Ogre</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[drm]]></category>
		<category><![CDATA[ebooks]]></category>
		<category><![CDATA[kindle]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scons]]></category>

		<guid isPermaLink="false">http://rumsey.org/blog/?p=264</guid>
		<description><![CDATA[I have a Kindle. I like it a lot, but it has some issues. The recent Macmillan vs. Amazon fight is one. Another is the DRM on every file purchased from Amazon. If I buy a book, I want to know that I can read it forever. Luckily, smart people figured out how to break [...]]]></description>
			<content:encoded><![CDATA[<p>I have a Kindle.  I like it a lot, but it has some issues.  The recent <a href="http://www.antipope.org/charlie/blog-static/2010/02/amazonfail-round-up.html">Macmillan</a> vs. <a href="http://whatever.scalzi.com/2010/01/30/a-quick-note-on-ebook-pricing/">Amazon</a> fight is one.  Another is the DRM on every file purchased from Amazon.  If I buy a book, I want to know that I can read it forever.  Luckily, smart people figured out how to break the DRM on most Kindle books a long time ago.  A few books are in another format called Topaz that until recently hadn&#8217;t been broken.  I just found a book I wanted that was in that format, so I went and looked again, and it turns out someone finally cracked it about a month ago.</p>
<p>I&#8217;m not going to link to any of the actual tools here, but they shouldn&#8217;t be too hard to find.  My contribution is an SConstruct file for the <a href="http://scons.org/">SCons</a> build system that automatically copies all my books to my computer and removes the DRM all in one step.  It&#8217;s not your typical use of a build system, but when I thought about what I was trying to do, I realized it was really just a simple dependency graph, something SCons is perfect for.</p>
<p>The complete process is:</p>
<ol>
<li>Plug Kindle into computer via USB</li>
<li>In a shell, cd &lt;path/where/this/file/lives&gt;</li>
<li>scons</li>
</ol>
<p>This will automatically get any new books, and remove the DRM (and in Topaz&#8217;s case, convert them into svg files viewable in a browser)</p>
<p>Installation is not difficult either:</p>
<ol>
<li>Install SCons</li>
<li>Put this SConstruct file in the directory where you want to save your books</li>
<li>Get your Kindle&#8217;s PID and put it in the SConstruct file (the DRM tools will tell you how to do that)</li>
<li>Edit the location your Kindle gets mounted to.  The one I have in there is for a Mac, but except for that path I don&#8217;t see any reason this won&#8217;t all work on any OS</li>
<li>Put the DRM tools in a tools subdirectory</li>
</ol>
<p>SConstruct file after the jump<br />
<span id="more-264"></span></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
&nbsp;
env = Environment<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Put your Kindle's PID here</span>
env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'KINDLECODE'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'1234567890'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Put the path to your Kindle when attached via USB</span>
<span style="color: #808080; font-style: italic;"># (This is where it shows up on a Mac)</span>
env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'DEVICEDIR'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'/Volumes/Kindle/documents'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Topaz dedrm only wants the first 8 chars of the kindle PID</span>
env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'SHORTKINDLECODE'</span><span style="color: black;">&#93;</span> = env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'KINDLECODE'</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>:<span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>
&nbsp;
env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'MOBIDEDRM'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'tools/MOBI/MobiDeDrm09.py'</span>
topazprogs=<span style="color: #483d8b;">'tools/TOPAZ/'</span>
env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'TOPAZDEDRM'</span><span style="color: black;">&#93;</span> = topazprogs + <span style="color: #483d8b;">'cmbtc_dump_nonK4PC.py'</span>
env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'TOPAZ2SVG'</span><span style="color: black;">&#93;</span> = topazprogs + <span style="color: #483d8b;">'gensvg.py'</span>
env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'TOPAZ2HTML'</span><span style="color: black;">&#93;</span> = topazprogs + <span style="color: #483d8b;">'genhtml.py'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'DEVICEDIR'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
    kindle = Glob<span style="color: black;">&#40;</span>env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'DEVICEDIR'</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">'/*.azw'</span><span style="color: black;">&#41;</span> + Glob<span style="color: black;">&#40;</span>env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'DEVICEDIR'</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">'/*.azw1'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> k <span style="color: #ff7700;font-weight:bold;">in</span> kindle:
        Command<span style="color: black;">&#40;</span><span style="color: #483d8b;">'DRM/'</span>+k.<span style="color: black;">name</span>, k, Copy<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;$TARGET&quot;</span>, <span style="color: #483d8b;">&quot;$SOURCE&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
azw = Glob<span style="color: black;">&#40;</span><span style="color: #483d8b;">'DRM/*.azw'</span><span style="color: black;">&#41;</span>
mobi = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> a <span style="color: #ff7700;font-weight:bold;">in</span> azw:
    base,ext = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">splitext</span><span style="color: black;">&#40;</span>a.<span style="color: black;">name</span><span style="color: black;">&#41;</span>
    mobi += env.<span style="color: black;">Command</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'#Mobi/'</span>+base+<span style="color: #483d8b;">'.mobi'</span>, a,
                        <span style="color: #483d8b;">'$MOBIDEDRM $SOURCE $TARGET &quot;$KINDLECODE&quot;'</span><span style="color: black;">&#41;</span>
Ignore<span style="color: black;">&#40;</span>mobi, env<span style="color: black;">&#91;</span><span style="color: #483d8b;">'MOBIDEDRM'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
azw1 = Glob<span style="color: black;">&#40;</span><span style="color: #483d8b;">'DRM/*.azw1'</span><span style="color: black;">&#41;</span>
topaz = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> a <span style="color: #ff7700;font-weight:bold;">in</span> azw1:
    base,ext = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">splitext</span><span style="color: black;">&#40;</span>a.<span style="color: black;">name</span><span style="color: black;">&#41;</span>
    topazdir = env.<span style="color: black;">Dir</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'#Topaz/'</span>+base+<span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span>
    dat = env.<span style="color: black;">Command</span><span style="color: black;">&#40;</span>topazdir.<span style="color: black;">File</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'dict0000.dat'</span><span style="color: black;">&#41;</span>, a,
                      <span style="color: #483d8b;">'$TOPAZDEDRM -v -v -d -o &quot;'</span>+topazdir.<span style="color: black;">path</span>+<span style="color: #483d8b;">'&quot; -p &quot;$SHORTKINDLECODE&quot; $SOURCE'</span><span style="color: black;">&#41;</span>
    svg = env.<span style="color: black;">Command</span><span style="color: black;">&#40;</span>topazdir.<span style="color: black;">Dir</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'svg'</span><span style="color: black;">&#41;</span>, dat,
                      <span style="color: #483d8b;">'$TOPAZ2SVG &quot;'</span>+topazdir.<span style="color: black;">path</span>+<span style="color: #483d8b;">'&quot;'</span><span style="color: black;">&#41;</span>
    topaz += svg
    <span style="color: #808080; font-style: italic;">#html = env.Command('#Topaz/'+base+'/book.html', topazdir,</span>
    <span style="color: #808080; font-style: italic;">#                   '$TOPAZ2HTML $SOURCE')</span>
    <span style="color: #808080; font-style: italic;">#topaz += html</span>
    <span style="color: #808080; font-style: italic;">#env.Depends(html, svg)</span>
&nbsp;
env.<span style="color: black;">Alias</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'all'</span>, mobi<span style="color: black;">&#41;</span>
env.<span style="color: black;">Alias</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'all'</span>, topaz<span style="color: black;">&#41;</span>
&nbsp;
env.<span style="color: black;">Alias</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'mobi'</span>, mobi<span style="color: black;">&#41;</span>
env.<span style="color: black;">Alias</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'topaz'</span>, topaz<span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://rumsey.org/blog/2010/02/kindle-drm-removal-using-scons/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

