<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Peter's Blog - Nodes for mp3</title>
    <link>http://www.petersblog.org/</link>
    <description>Nodes containing the tag mp3</description>
    <item>
      <title>Embedding Flash Player</title>
      <link>http://www.petersblog.org/node/view/1614</link>
      <description>&lt;p&gt;
Much as I hate flash, it is a nice way to embed a sound or video player in a page. Here's how I did it in &lt;a href="/tag/rails"&gt;rails&lt;/a&gt; using the &lt;a href="http://www.jeroenwijering.com/?item=JW_FLV_Player"&gt;JW FLV Media Player&lt;/a&gt;. I added the following to my view: 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;script&lt;/span&gt; &lt;span class="MetaTag"&gt;type&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;text/javascript&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="MetaTag"&gt;src&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;/javascripts/swfobject.js&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;script&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &amp;lt;% &lt;span class="Keyword"&gt;for&lt;/span&gt; oRssItem &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;rssitems&lt;/span&gt; %&amp;gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;hr&lt;/span&gt;/&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;   &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;h3&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;lt;%= oRssItem.&lt;span class="Entity"&gt;title&lt;/span&gt; %&amp;gt;&lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;h3&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;   &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;p&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;lt;%= oRssItem.&lt;span class="Entity"&gt;description&lt;/span&gt; %&amp;gt;&lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;p&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;   &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;table&lt;/span&gt; &lt;span class="MetaTag"&gt;width&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;470&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;     &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;tr&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;        &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;td&lt;/span&gt; &lt;span class="MetaTag"&gt;wIdth&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;50%&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;lt;%= oRssItem.&lt;span class="Entity"&gt;created&lt;/span&gt;.&lt;span class="Entity"&gt;strftime&lt;/span&gt;( &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;%m %B %y&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) %&amp;gt;&lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;td&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt;        &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;td&lt;/span&gt; &lt;span class="MetaTag"&gt;align&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;right&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;lt;%= link_to &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Download&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;/&lt;span class="String"&gt;&lt;span class="String"&gt;#{&lt;/span&gt;&lt;span class="String"&gt; &lt;/span&gt;oRssItem&lt;span class="String"&gt;&lt;span class="String"&gt;.&lt;/span&gt;&lt;span class="Entity"&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; %&amp;gt;&lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;td&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt;     &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;tr&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;   &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;table&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;   &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="MetaTag"&gt;div&lt;/span&gt; &lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;id&lt;/span&gt;&lt;span class="MetaTag"&gt;=&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;player&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;lt;%=&lt;/span&gt;oRssItem&lt;span class="String"&gt;&lt;span class="String"&gt;.&lt;/span&gt;&lt;span class="MetaTag"&gt;id&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;This text will be replaced&lt;span class="MetaTag"&gt;&lt;span class="MetaTag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="MetaTag"&gt;div&lt;/span&gt;&lt;span class="MetaTag"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt;   &amp;lt;&lt;span class="Entity"&gt;script&lt;/span&gt; &lt;span class="Entity"&gt;type&lt;/span&gt;=&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;text/javascript&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&amp;gt;
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt;     &lt;span class="Keyword"&gt;var&lt;/span&gt; so &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Keyword"&gt;new&lt;/span&gt; &lt;span class="Entity"&gt;SWFObject&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;/mediaplayer.swf&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;mpl&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;470&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;20&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;8&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt;     so.addParam(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;allowscriptaccess&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;always&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  19 &lt;/span&gt;     so.addParam(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;allowfullscreen&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;true&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  20 &lt;/span&gt;     so.addVariable(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;width&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;470&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  21 &lt;/span&gt;     so.addVariable(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;height&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;20&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  22 &lt;/span&gt;     so.addVariable(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;file&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;/&amp;lt;%= oRssItem.filename%&amp;gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  23 &lt;/span&gt;     so.&lt;span class="Support"&gt;write&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;player&amp;lt;%=oRssItem.id%&amp;gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  24 &lt;/span&gt;   &amp;lt;/&lt;span class="Entity"&gt;script&lt;/span&gt;&amp;gt;
&lt;span class="line-numbers"&gt;  25 &lt;/span&gt; &amp;lt;% &lt;span class="Keyword"&gt;end&lt;/span&gt; %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
This generates a page full of podcast entries, each with a little media player thing so you can listen to them easily. This does mp3 files but it can handle video too. 
&lt;/p&gt;
&lt;p&gt;
I am aware that the swfobject.js would be better loaded in the html header. 
&lt;/p&gt;
&lt;p&gt;
Here's a demo: I don't know if this will work in the rss feed (UPDATE: no!) so bear with me and please be gentle on my bandwidth, it's quite a catchy tune: 
&lt;/p&gt;
&lt;p&gt;
&lt;script type="text/javascript" src="/javascripts/swfobject.js"&gt;&lt;/script&gt; 
&lt;/p&gt;
&lt;div class="rawhtml-block"&gt;  &lt;div id="player571"&gt;Oops, no flash? Javascript broken? Works for me.&lt;/div&gt;

  &lt;script type="text/javascript"&gt;
    var so = new SWFObject('/mediaplayer.swf','mpl','470','20','8');
    so.addParam('allowscriptaccess','always');
    so.addParam('allowfullscreen','true');
    so.addVariable('width','470');
    so.addVariable('height','20');
    so.addVariable('file','/files/um_bongo_lo.mp3');
    so.write('player571');
  &lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
The main reason I am blogging this is because it only needs a change to a view file and installation of two files in the /public directory (the player and a javascript file). Since view files are awkward to comment legibly I decided to document it all here so I can find it again. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/rails"&gt;rails&lt;/a&gt; &lt;a href="/tag/ruby"&gt;ruby&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/1614</guid>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">rails</category>
      <category domain="http://www.technorati.com/tag">ruby</category>
    </item>
    <item>
      <title>HP Ipaq rx1950 Pocketpc</title>
      <link>http://www.petersblog.org/node/view/1143</link>
      <description>&lt;p&gt;
Bought myself a new PDA, an HP Ipaq rx1950 Pocketpc. It was a bit of an impulse buy, a bit of retail therapy I felt in need of a few weeks back. The model I bought was essentially the cheapest I could get locally that had integrated wifi. 
&lt;/p&gt;
&lt;p&gt;
I used to use a palm tungsten T2 but it's digitiser does not work properly, it takes about five goes to get past the initial calibration and it's downhill from there. I still had a hankering for a pda, a portable notetaking device to serve as a backup for my failing memory. 
&lt;/p&gt;
&lt;p&gt;
Following my experiences with the palm and bluetooth I decided that wifi was pretty much essential, bluetooth was slow and the bluetooth stacks in windows complex and buggy. 
&lt;/p&gt;
&lt;p&gt;
The rx1950 runs Windows Mobile 2005, the latest name for Windows CE/pocketpc. It is a stylus driven thing, not my first preference but keyboard models are more expensive and have smaller screens. 
&lt;/p&gt;
&lt;p&gt;
Bullet point review: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
first impression when I took it out the box was how light it is, much lighter than my old palm. It's fairly thin as well, maybe half an inch thick. It would fit  better in a trouser pocket if not for the carry case that comes with it which is almost as thick again. 
&lt;/li&gt;
&lt;li&gt;
nice solid build quality: HP after all. 
&lt;/li&gt;
&lt;li&gt;
stylus has a tendency to fall out: I put it in the carrying case the wrong way round to restrain it or I would certainly lose it. 
&lt;/li&gt;
&lt;li&gt;
no charging cradle: comes with a USB cable and a mains adapter that plugs into the USB cable: rather awkward and fiddly and annoying that it cannot charge from the USB port. There are aftermarket USB cables available that will charge it. 
&lt;/li&gt;
&lt;li&gt;
synchronises with the pc using activesync and I was amazed to discover that it won't sync over the wifi. Apparently microsoft decided it was a security hole and they couldn't think of a way to plug it so they just removed    the feature. This leaves USB or infra-red so I'm using USB when I feel the need. Many pocketpc apps are available as cab files that can be downloaded directly to the device over the wifi and installed. Some producers are not enlightened to this and ship apps with windows installers that use activesync and hence can only be installed at home base. 
&lt;/li&gt;
&lt;li&gt;
the device has 32M of 'program memory' for running programs data and this isn't really enough. The symptoms of this seem to be the o/s terminating apps that are not in the foreground. If you have, say, windows media player playing something then you can only run maybe one more program before something gets randomly zapped. Microsoft have tried to create a paradigm where you don't have separate applications but flip between different modes without worrying about having to close apps down. Apps are closed automatically by the OS as memory runs low and should be designed to save their state such that when they are reopened they are in the same state as when they were shut down. Unfortunately it looks like developers use standard development techniques and applications being suddenly terminated by the OS leaves the user high and dry. 
&lt;/li&gt;
&lt;li&gt;
it has another 32M for storing programs but I bought a 1G SD card and I put everything in that. 
&lt;/li&gt;
&lt;li&gt;
the screen is just about big enough. It is ok for reading without scrolling too much. For most web browsing it is awful unless I use http://skweezercom or google mobile to strip out any fancy stuff. 
&lt;/li&gt;
&lt;li&gt;
the character recognisers that come with it are not much good: the handwriting recognition (transcriber) is slow and inaccurate. I am using something called Tengo which is a bit like predictive text on a phone so involves hitting only six big buttons. It has some clever design features and there is something about it that is kinda fun. I am writing this review with it so you may spot predictive-text style wrong word errors. 
&lt;/li&gt;
&lt;li&gt;
a frequently used feature is the reset button: windows mobile is a typical windows o/s and isn't sophisticated enough to offer robust task management. Applications can lock it hard and banging on an unresponsive plastic screen is particularly fruitless. 
&lt;/li&gt;
&lt;li&gt;
it has speaker and microphone. The speaker is just about loud enough to listen to podcasts. I haven't tried skype on it, the skype site doesn't list the rx1950 as supported and the cpu may not be fast enough. 
&lt;/li&gt;
&lt;li&gt;
has 3.5mm audio jack and the sound to my ears was pretty good. It is a good  mp3 player. 
&lt;/li&gt;
&lt;li&gt;
battery life is very good, one charge gives a good day of use. 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
As a device for browsing rss feeds while watching tv, taking notes, listening to music, watching videos or whatever it is just fine. It is more convenient than a laptop and I can carry it in my pocket so is far more mobile. I can see that it is a quirky platform and will probably have been killed off by mobile phones and mp3 players within two years time. 
&lt;/p&gt;
&lt;p&gt;
I'll write about the applications I have installed in it some other time. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/bluetooth"&gt;bluetooth&lt;/a&gt; &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/palm"&gt;palm&lt;/a&gt; &lt;a href="/tag/pocketpc"&gt;pocketpc&lt;/a&gt; &lt;a href="/tag/rss"&gt;rss&lt;/a&gt; &lt;a href="/tag/skype"&gt;skype&lt;/a&gt; &lt;a href="/tag/wifi"&gt;wifi&lt;/a&gt; &lt;a href="/tag/windows"&gt;windows&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/1143</guid>
      <category domain="http://www.technorati.com/tag">bluetooth</category>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">palm</category>
      <category domain="http://www.technorati.com/tag">pocketpc</category>
      <category domain="http://www.technorati.com/tag">rss</category>
      <category domain="http://www.technorati.com/tag">skype</category>
      <category domain="http://www.technorati.com/tag">wifi</category>
      <category domain="http://www.technorati.com/tag">windows</category>
    </item>
    <item>
      <title>Podcast download in python revisited</title>
      <link>http://www.petersblog.org/node/view/956</link>
      <description>&lt;p&gt;
I decided to update my &lt;a href="/node/713"&gt;python podcast script&lt;/a&gt; ipydder.py. Based on the comments for the old version I ditched the horrible sax parser and used the lovely &lt;a href="http://www.crummy.com/software/BeautifulSoup"&gt;Beautiful Soup&lt;/a&gt;. This has simplified it a great deal, 49 lines of code if I delete all the comments. 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;!/usr/bin/python&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; ipydder mark 2&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Download podcasts&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; BeautifulSoup
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; os
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;GetPodcast&lt;/span&gt;( &lt;span class="Variable"&gt;strFeed&lt;/span&gt;, &lt;span class="Variable"&gt;strTargetDir&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Get the rss file.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;     strRSS &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;os.popen4&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;wget -q -O - &amp;quot;&lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&amp;quot;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strFeed&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;[&lt;span class="Constant"&gt;1&lt;/span&gt;].&lt;span class="MetaFunctionCallPy"&gt;read&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Parsing it.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  19 &lt;/span&gt;     oSoup &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;BeautifulSoup.BeautifulStoneSoup&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  20 &lt;/span&gt;     &lt;span class="MetaFunctionCallPy"&gt;oSoup.feed&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strRSS&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  21 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  22 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  23 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Go through the items in the feed.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  24 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  25 &lt;/span&gt;     &lt;span class="Keyword"&gt;for&lt;/span&gt; oItem &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;oSoup&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;item&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  26 &lt;/span&gt;         &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  27 &lt;/span&gt;         &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Look for enclosures in the item.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  28 &lt;/span&gt;         &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  29 &lt;/span&gt;         strUrl &lt;span class="Keyword"&gt;=&lt;/span&gt; oItem.enclosure[ &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;url&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;]
&lt;span class="line-numbers"&gt;  30 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;not&lt;/span&gt; strUrl:
&lt;span class="line-numbers"&gt;  31 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  32 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; If no enclosures, see if there is a link&lt;/span&gt;
&lt;span class="line-numbers"&gt;  33 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  34 &lt;/span&gt;             strUrl &lt;span class="Keyword"&gt;=&lt;/span&gt; oItem.link.string
&lt;span class="line-numbers"&gt;  35 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  36 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; strUrl:
&lt;span class="line-numbers"&gt;  37 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  38 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Remove whitespace.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  39 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  40 &lt;/span&gt;             strUrl &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;strUrl.strip&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  41 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  42 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  43 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Look for mp3 enclosures&lt;/span&gt;
&lt;span class="line-numbers"&gt;  44 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  45 &lt;/span&gt;             &lt;span class="Keyword"&gt;if&lt;/span&gt; strUrl[&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;4&lt;/span&gt;:].&lt;span class="MetaFunctionCallPy"&gt;lower&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.mp3&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  46 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  47 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Ok there is an mp3 file to be had&lt;/span&gt;
&lt;span class="line-numbers"&gt;  48 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  49 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Determine unique id for this item&lt;/span&gt;
&lt;span class="line-numbers"&gt;  50 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  51 &lt;/span&gt;                 strGuid &lt;span class="Keyword"&gt;=&lt;/span&gt; oItem.guid.string
&lt;span class="line-numbers"&gt;  52 &lt;/span&gt;                 &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;not&lt;/span&gt; strGuid:
&lt;span class="line-numbers"&gt;  53 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  54 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; No guid, lets use the file url.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  55 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Presumably each file name is unique.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  56 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  57 &lt;/span&gt;                     strGuid &lt;span class="Keyword"&gt;=&lt;/span&gt; strUrl
&lt;span class="line-numbers"&gt;  58 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  59 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  60 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; See if guid has already been downloaded by searching the database&lt;/span&gt;
&lt;span class="line-numbers"&gt;  61 &lt;/span&gt;                 &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  62 &lt;/span&gt;                 strDBFile &lt;span class="Keyword"&gt;=&lt;/span&gt; strTargetDir &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;/.ipydder.db&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  63 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  64 &lt;/span&gt;                 &lt;span class="Keyword"&gt;try&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  65 &lt;/span&gt;                     oDB &lt;span class="Keyword"&gt;=&lt;/span&gt; [ &lt;span class="MetaFunctionCallPy"&gt;strLine.strip&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;for&lt;/span&gt; strLine &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;open&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strDBFile&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;readlines&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;]
&lt;span class="line-numbers"&gt;  66 &lt;/span&gt;                 &lt;span class="Keyword"&gt;except&lt;/span&gt;(&lt;span class="Support"&gt;IOError&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  67 &lt;/span&gt;                     oDB &lt;span class="Keyword"&gt;=&lt;/span&gt; []
&lt;span class="line-numbers"&gt;  68 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  69 &lt;/span&gt;                 &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;not&lt;/span&gt; strGuid &lt;span class="Keyword"&gt;in&lt;/span&gt; oDB:
&lt;span class="line-numbers"&gt;  70 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  71 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; try to download the file&lt;/span&gt;
&lt;span class="line-numbers"&gt;  72 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Use wget as a more robust way to download big mp3 files&lt;/span&gt;
&lt;span class="line-numbers"&gt;  73 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  74 &lt;/span&gt;                     &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Downloading &lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strUrl
&lt;span class="line-numbers"&gt;  75 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  76 &lt;/span&gt;                     &lt;span class="MetaFunctionCallPy"&gt;os.chdir&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strTargetDir&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  77 &lt;/span&gt;                     strResults &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;os.popen4&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;wget -nv &amp;quot;&lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&amp;quot;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strUrl&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;[&lt;span class="Constant"&gt;1&lt;/span&gt;].&lt;span class="MetaFunctionCallPy"&gt;read&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  78 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  79 &lt;/span&gt;                     strFileName &lt;span class="Keyword"&gt;=&lt;/span&gt; strTargetDir &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;os.path.basename&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strUrl&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  80 &lt;/span&gt;                     &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Downloaded file &lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strFileName
&lt;span class="line-numbers"&gt;  81 &lt;/span&gt;                     &lt;span class="Keyword"&gt;print&lt;/span&gt; strResults
&lt;span class="line-numbers"&gt;  82 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  83 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  84 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Remember that the file has been processed, don't download it again.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  85 &lt;/span&gt;                     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  86 &lt;/span&gt;                     &lt;span class="MetaFunctionCallPy"&gt;oDB.append&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strGuid&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  87 &lt;/span&gt;                     &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;open&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strDBFile, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;wt&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;write&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="Constant"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;join&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; oDB&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  88 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  89 &lt;/span&gt; strHomeDir &lt;span class="Keyword"&gt;=&lt;/span&gt; os.environ[&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;HOME&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;] &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;/&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  90 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  91 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;GetPodcast&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;http://radio.weblogs.com/0001014/categories/dailySourceCode/rss.xml&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  92 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                strHomeDir &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Podcasts/DailySourceCode&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  93 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;GetPodcast&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;http://www.morningcoffeenotes.com/rss.xml&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  94 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                strHomeDir &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Podcasts/CoffeeNotes&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/python"&gt;python&lt;/a&gt; &lt;a href="/tag/rss"&gt;rss&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/956</guid>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">python</category>
      <category domain="http://www.technorati.com/tag">rss</category>
    </item>
    <item>
      <title>Mp3 ringtones</title>
      <link>http://www.petersblog.org/node/view/722</link>
      <description>&lt;p&gt;
I've still got to wait till August before I can update my phone to one that plays mp3's. When I do I have decided that &lt;a href="http://www.umbongo.com/mp3/um_bongo_lo.mp3"&gt;this&lt;/a&gt; is going to be my ringtone. It makes crazy frog look cool. I've saved the file in case the link dies in 6 months time. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/phone"&gt;phone&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/722</guid>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">phone</category>
    </item>
    <item>
      <title>Downloading Podcasts in Python</title>
      <link>http://www.petersblog.org/node/view/713</link>
      <description>&lt;p&gt;
I like to listen to the &lt;a href="http://www.curry.com"&gt;Daily Source Code&lt;/a&gt; podcast while &lt;a href="/node/655"&gt;rowing&lt;/a&gt;. I've always liked talk radio and this is like talk radio with F words. 
&lt;/p&gt;
&lt;p&gt;
The podcast files are about 20Megs and they take a few minutes to download on my 750k broadband connection. I wanted to have my &lt;a href="http://www.ubuntulinux.org"&gt;Ubuntu&lt;/a&gt; box download them automatically so they would be ready for me (as was the &lt;a href="http://www.thetwowayweb.com/payloadsforrss"&gt;original vision&lt;/a&gt; of podcasting). 
&lt;/p&gt;
&lt;p&gt;
I decided to knock up a &lt;a href="http://www.python.org"&gt;python&lt;/a&gt; script to do it for me as I didn't want a gui tool and the only other script I found was written in ruby :sick:. This script downloads the rss feed from the podcasting site, looking for mp3 files. Any that it finds it will download. It remembers which files it has downloaded so you can listen to them and delete them and they won't be downloaded again. It doesn't play the files, thats done by Totem. 
&lt;/p&gt;
&lt;p&gt;
Other podcasts can be added easily enough. 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Download podcasts&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; xml.parsers.expat
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; re
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; os
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; traceback
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="Keyword"&gt;import&lt;/span&gt; sys
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="Entity"&gt;FeedParser&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt;   &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; 3 handler functions&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;   &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;&lt;span class="Support"&gt;__init__&lt;/span&gt;&lt;/span&gt;( &lt;span class="Variable"&gt;self&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;     &lt;span class="Variable"&gt;self&lt;/span&gt;.oElementStack &lt;span class="Keyword"&gt;=&lt;/span&gt; []
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;     &lt;span class="Variable"&gt;self&lt;/span&gt;.bItem &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;False&lt;/span&gt;
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt;     &lt;span class="Variable"&gt;self&lt;/span&gt;.oItem &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;None&lt;/span&gt;
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt;   &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;Parse&lt;/span&gt;( &lt;span class="Variable"&gt;self&lt;/span&gt;, &lt;span class="Variable"&gt;strFeed&lt;/span&gt;, &lt;span class="Variable"&gt;strRETitle&lt;/span&gt;, &lt;span class="Variable"&gt;strTargetDir&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  19 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Parse feed, given url and regular expression describing podcast title.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  20 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  21 &lt;/span&gt;     &lt;span class="Variable"&gt;self&lt;/span&gt;.oRETitle &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;re.compile&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strRETitle&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  22 &lt;/span&gt;     &lt;span class="Variable"&gt;self&lt;/span&gt;.strTargetDir &lt;span class="Keyword"&gt;=&lt;/span&gt; strTargetDir
&lt;span class="line-numbers"&gt;  23 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  24 &lt;/span&gt;   &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  25 &lt;/span&gt;   &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Open database to remember what files have been dealt with&lt;/span&gt;
&lt;span class="line-numbers"&gt;  26 &lt;/span&gt;   &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  27 &lt;/span&gt;     &lt;span class="Keyword"&gt;try&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  28 &lt;/span&gt;       &lt;span class="Variable"&gt;self&lt;/span&gt;.oDB &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;open&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strTargetDir &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.pypodder.db&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;read&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;split&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="Constant"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  29 &lt;/span&gt;     &lt;span class="Keyword"&gt;except&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  30 &lt;/span&gt;       &lt;span class="Variable"&gt;self&lt;/span&gt;.oDB &lt;span class="Keyword"&gt;=&lt;/span&gt; []
&lt;span class="line-numbers"&gt;  31 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  32 &lt;/span&gt;     p &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;xml.parsers.expat.ParserCreate&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  33 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  34 &lt;/span&gt;     p.StartElementHandler &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.start_element
&lt;span class="line-numbers"&gt;  35 &lt;/span&gt;     p.EndElementHandler &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.end_element
&lt;span class="line-numbers"&gt;  36 &lt;/span&gt;     p.CharacterDataHandler &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.char_data
&lt;span class="line-numbers"&gt;  37 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  38 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  39 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Read feeed using wget as it is robust.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  40 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  41 &lt;/span&gt;     strRSS &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;os.popen4&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;wget -q -O - &amp;quot;&lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&amp;quot;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strFeed&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;[&lt;span class="Constant"&gt;1&lt;/span&gt;].&lt;span class="MetaFunctionCallPy"&gt;read&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  42 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;    print strRSS&lt;/span&gt;
&lt;span class="line-numbers"&gt;  43 &lt;/span&gt;     &lt;span class="MetaFunctionCallPy"&gt;p.Parse&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strRSS&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  44 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  45 &lt;/span&gt;   &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;start_element&lt;/span&gt;(&lt;span class="Variable"&gt;self&lt;/span&gt;, &lt;span class="Variable"&gt;name&lt;/span&gt;, &lt;span class="Variable"&gt;attrs&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  46 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  47 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Put element on element stack alog with empty data array&lt;/span&gt;
&lt;span class="line-numbers"&gt;  48 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  49 &lt;/span&gt;     &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oElementStack.append&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;[&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;name&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;,&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;[&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  50 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  51 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  52 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; If this is the start of an item then reset the item contents&lt;/span&gt;
&lt;span class="line-numbers"&gt;  53 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  54 &lt;/span&gt;     &lt;span class="Keyword"&gt;if&lt;/span&gt; name &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;item&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  55 &lt;/span&gt;       &lt;span class="Variable"&gt;self&lt;/span&gt;.bItem &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;True&lt;/span&gt;
&lt;span class="line-numbers"&gt;  56 &lt;/span&gt;       &lt;span class="Variable"&gt;self&lt;/span&gt;.oItem &lt;span class="Keyword"&gt;=&lt;/span&gt; {}
&lt;span class="line-numbers"&gt;  57 &lt;/span&gt;     &lt;span class="Keyword"&gt;elif&lt;/span&gt; name &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;enclosure&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  58 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  59 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; If element is an enclosure then get the url&lt;/span&gt;
&lt;span class="line-numbers"&gt;  60 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  61 &lt;/span&gt;       strUrl &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;attrs.get&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;url&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  62 &lt;/span&gt;       &lt;span class="Keyword"&gt;if&lt;/span&gt; strUrl:
&lt;span class="line-numbers"&gt;  63 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.bItem:
&lt;span class="line-numbers"&gt;  64 &lt;/span&gt;           &lt;span class="Variable"&gt;self&lt;/span&gt;.oItem[&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;enclosure&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;]&lt;span class="Keyword"&gt;=&lt;/span&gt;strUrl
&lt;span class="line-numbers"&gt;  65 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  66 &lt;/span&gt;   &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;end_element&lt;/span&gt;(&lt;span class="Variable"&gt;self&lt;/span&gt;, &lt;span class="Variable"&gt;name&lt;/span&gt;):
&lt;span class="line-numbers"&gt;  67 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  68 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Pop complete element from the element stack&lt;/span&gt;
&lt;span class="line-numbers"&gt;  69 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  70 &lt;/span&gt;     strElement, strData &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oElementStack.pop&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  71 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  72 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  73 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Check for sillies&lt;/span&gt;
&lt;span class="line-numbers"&gt;  74 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  75 &lt;/span&gt;     &lt;span class="Keyword"&gt;if&lt;/span&gt; strElement &lt;span class="Keyword"&gt;!=&lt;/span&gt; name:
&lt;span class="line-numbers"&gt;  76 &lt;/span&gt;       &lt;span class="Keyword"&gt;raise&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Element mismatch: &lt;span class="StringInterpolation"&gt;%s&lt;/span&gt; != &lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; (name, strElement)
&lt;span class="line-numbers"&gt;  77 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  78 &lt;/span&gt;     &lt;span class="Keyword"&gt;if&lt;/span&gt; strElement &lt;span class="Keyword"&gt;!=&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;item&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  79 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  80 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Get data associated with element and store in item&lt;/span&gt;
&lt;span class="line-numbers"&gt;  81 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  82 &lt;/span&gt;       &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.bItem:
&lt;span class="line-numbers"&gt;  83 &lt;/span&gt;         strData &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;join&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strData&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;strip&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  84 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  85 &lt;/span&gt;         &lt;span class="Variable"&gt;self&lt;/span&gt;.oItem[strElement] &lt;span class="Keyword"&gt;=&lt;/span&gt; strData
&lt;span class="line-numbers"&gt;  86 &lt;/span&gt;     &lt;span class="Keyword"&gt;else&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  87 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  88 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Item is complete.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  89 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; See if item title matches the re provided&lt;/span&gt;
&lt;span class="line-numbers"&gt;  90 &lt;/span&gt;       &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  91 &lt;/span&gt;       &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oRETitle.match&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oItem.get&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;title&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;encode&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt;  92 &lt;/span&gt;         &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  93 &lt;/span&gt;         &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Try to get url of mp3 file&lt;/span&gt;
&lt;span class="line-numbers"&gt;  94 &lt;/span&gt;         &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  95 &lt;/span&gt;         strUrl &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oItem.get&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;enclosure&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  96 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;not&lt;/span&gt; strUrl:
&lt;span class="line-numbers"&gt;  97 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  98 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; No enclosure, try the 'link' field.&lt;/span&gt;
&lt;span class="line-numbers"&gt;  99 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 100 &lt;/span&gt;           strUrl &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oItem.get&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;link&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;encode&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 101 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 102 &lt;/span&gt;         &lt;span class="Keyword"&gt;if&lt;/span&gt; strUrl &lt;span class="Keyword"&gt;and&lt;/span&gt; strUrl[&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;4&lt;/span&gt;:].&lt;span class="MetaFunctionCallPy"&gt;lower&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.mp3&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;:
&lt;span class="line-numbers"&gt; 103 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 104 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; See if item has a guid&lt;/span&gt;
&lt;span class="line-numbers"&gt; 105 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 106 &lt;/span&gt;           strGuid &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oItem.get&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;guid&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;encode&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 107 &lt;/span&gt;           &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;not&lt;/span&gt; strGuid:
&lt;span class="line-numbers"&gt; 108 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 109 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; If no guid then use the link url as a guid&lt;/span&gt;
&lt;span class="line-numbers"&gt; 110 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 111 &lt;/span&gt;             strGuid &lt;span class="Keyword"&gt;=&lt;/span&gt; strUrl
&lt;span class="line-numbers"&gt; 112 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 113 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 114 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; See if guid has already been processed in the database&lt;/span&gt;
&lt;span class="line-numbers"&gt; 115 &lt;/span&gt;           &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 116 &lt;/span&gt;           &lt;span class="Keyword"&gt;if&lt;/span&gt; &lt;span class="Keyword"&gt;not&lt;/span&gt; strGuid &lt;span class="Keyword"&gt;in&lt;/span&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.oDB:
&lt;span class="line-numbers"&gt; 117 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 118 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; try to download the file&lt;/span&gt;
&lt;span class="line-numbers"&gt; 119 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Use wget as a more robust way to download big mp3 files&lt;/span&gt;
&lt;span class="line-numbers"&gt; 120 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 121 &lt;/span&gt;             &lt;span class="MetaFunctionCallPy"&gt;os.chdir&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.strTargetDir&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 122 &lt;/span&gt;             strResults &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;os.popen4&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;wget -q &amp;quot;&lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&amp;quot;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strUrl&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;[&lt;span class="Constant"&gt;1&lt;/span&gt;].&lt;span class="MetaFunctionCallPy"&gt;read&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 123 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 124 &lt;/span&gt;             strFileName &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.strTargetDir &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;os.path.basename&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strUrl&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 125 &lt;/span&gt;             &lt;span class="Keyword"&gt;print&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Downloaded file &lt;span class="StringInterpolation"&gt;%s&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;%&lt;/span&gt; strFileName
&lt;span class="line-numbers"&gt; 126 &lt;/span&gt;             &lt;span class="Keyword"&gt;print&lt;/span&gt; strResults
&lt;span class="line-numbers"&gt; 127 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 128 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 129 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Remember that the file has been processed, don't download it again.&lt;/span&gt;
&lt;span class="line-numbers"&gt; 130 &lt;/span&gt;             &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 131 &lt;/span&gt;             &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Variable"&gt;self&lt;/span&gt;.oDB.append&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; strGuid&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 132 &lt;/span&gt;             &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="Support"&gt;open&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.strTargetDir &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.pypodder.db&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;wt&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;write&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="Constant"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;join&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="Variable"&gt;self&lt;/span&gt;.oDB&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 133 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 134 &lt;/span&gt;       &lt;span class="Variable"&gt;self&lt;/span&gt;.oItem &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;None&lt;/span&gt;
&lt;span class="line-numbers"&gt; 135 &lt;/span&gt;       &lt;span class="Variable"&gt;self&lt;/span&gt;.bItem &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;False&lt;/span&gt;
&lt;span class="line-numbers"&gt; 136 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 137 &lt;/span&gt;   &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;char_data&lt;/span&gt;(&lt;span class="Variable"&gt;self&lt;/span&gt;, &lt;span class="Variable"&gt;data&lt;/span&gt;):
&lt;span class="line-numbers"&gt; 138 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 139 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Append data to element.&lt;/span&gt;
&lt;span class="line-numbers"&gt; 140 &lt;/span&gt;     &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 141 &lt;/span&gt;     &lt;span class="Variable"&gt;self&lt;/span&gt;.oElementStack[&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;][&lt;span class="Constant"&gt;1&lt;/span&gt;].&lt;span class="MetaFunctionCallPy"&gt;append&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; data&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 142 &lt;/span&gt; 
&lt;span class="line-numbers"&gt; 143 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;FeedParser&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;.&lt;span class="MetaFunctionCallPy"&gt;Parse&lt;span class="MetaFunctionCallPy"&gt;(&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;http://radio.weblogs.com/0001014/categories/dailySourceCode/rss.xml&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt; 144 &lt;/span&gt; &lt;span class="MetaFunctionCallPy"&gt;&lt;span class="MetaFunctionCallPy"&gt;                       &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Daily Source Code for.*&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;/home/peter/DailySourceCode/&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="MetaFunctionCallPy"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
I've set up cron to do this for me at 5:11pm every day, just before I get home from work for a row before eating (I don't recommend a half hour rowing with a full stomach). 
&lt;/p&gt;
&lt;div class="verbatim-block"&gt;&lt;pre&gt;crontab -e

11 17 * * * /usr/bin/python /home/peter/pypodder.py
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Update: I have altered the script above. There are three main changes: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
It now uses wget to do the downloading as it is more robust than using urllib2 which had a tendancy to timeout. 
&lt;/li&gt;
&lt;li&gt;
It is now using the proper Daily Source Code RSS feed, rather than Adam Curry's Weblog as the latter sometimes got the file names wrong. 
&lt;/li&gt;
&lt;li&gt;
The history of what has been downloaded is now a simple text file, making it easy to delete lines if necessary. 
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Related Posts: &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/python"&gt;python&lt;/a&gt; &lt;a href="/tag/rss"&gt;rss&lt;/a&gt; &lt;a href="/tag/ubuntu"&gt;ubuntu&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/713</guid>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">python</category>
      <category domain="http://www.technorati.com/tag">rss</category>
      <category domain="http://www.technorati.com/tag">ubuntu</category>
    </item>
    <item>
      <title>Listening to podcasts with Quicktime</title>
      <link>http://www.petersblog.org/node/view/709</link>
      <description>&lt;p&gt;
Upgraded to latest iTunes with intention of buying wife some Celine Dion and myself some Korn. However, their server seems to be overloaded this evening and won't let me register. 
&lt;/p&gt;
&lt;p&gt;
Anyway, decided to let Quicktime become the default mp3 player. One of my gripes with using Windows Media Player to play podcasts, particularly the &lt;a href="http://dailysourcecode.com/"&gt;Daily Source Code&lt;/a&gt; (which I listen to while rowing) is that I have to wait for the entire 20M or so file to download before it starts playing, which takes a couple of minutes and is a bind: I can't start rowing. 
&lt;/p&gt;
&lt;p&gt;
I had been thinking that surely a decent player would be able to start playing the audio stream while the file was still downloading and, sure enough, I tried it with QuickTime 6 and it works! No need to wait. Maybe Windows Media Player doesn't do this as part of an evil plan to discredit mp3 files. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/windows"&gt;windows&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/709</guid>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">windows</category>
    </item>
    <item>
      <title>Ubuntu mp3 downer</title>
      <link>http://www.petersblog.org/node/view/686</link>
      <description>&lt;p&gt;
My wife wanted me to rip a CD to put some mp3 files on her Creative MuVo flash player. I haven't done this since I got my &lt;a href="/node/380"&gt;new pc&lt;/a&gt; and wasn't sure I had a ripper. I went through a few options: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
Looked at RealOne. I only use Real to listen to &lt;a href="http://www.bbc.co.uk/radio"&gt;BBC Radio&lt;/a&gt;. This wouldn't rip mp3's unless I upgraded it to the premium version. 
&lt;/li&gt;
&lt;li&gt;
Decided &lt;a href="http://www.ubuntulinux.org"&gt;Ubuntu&lt;/a&gt; must have an mp3 ripper. Fired up the Ubuntu box, looked in the applications menu and found something called Juicer. This rips Ogg and a couple of other things but the mp3 option was greyed out. Search on web to find awkward machinations required to download mp3 codec, register it etc which I couldn't be bothered with. 
&lt;/li&gt;
&lt;li&gt;
On a hunch, tried the antithesis of Ubuntu, Windows Media Player. Yes, they done it again, it ripped the CD in about two minutes, It tried to nag me to use wma but I insisted. I copied the files to the MuVo via USB Mass Storage and it Just Worked. 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
I find it odd that something as basic in 2005 as ripping a CD to mp3 is not supported by Ubuntu in a straightforward way, via the applications menu. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/ubuntu"&gt;ubuntu&lt;/a&gt; &lt;a href="/tag/windows"&gt;windows&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/686</guid>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">ubuntu</category>
      <category domain="http://www.technorati.com/tag">windows</category>
    </item>
    <item>
      <title>Motorola V547 and Jabra Bluetooth Headset</title>
      <link>http://www.petersblog.org/node/view/677</link>
      <description>&lt;p&gt;
My wife has &lt;a href="/node/123"&gt;had her phone for a year&lt;/a&gt; so down to the O2 shop for an upgrade. She fancied a change from Nokia and liked the colour of the Motorola V600 but unfortunately that is discontinued, it has been replaced by the &lt;a href="http://direct.motorola.com/ENG/Product_Home.asp?country=GBR&amp;language=ENG&amp;productid=29248"&gt;V547&lt;/a&gt; so I got her one of those. For free &lt;img alt="smile" src="/images/smileys/smile.png" /&gt;. It has: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
Clamshell design 
&lt;/li&gt;
&lt;li&gt;
Bluetooth 
&lt;/li&gt;
&lt;li&gt;
Big clear screen 
&lt;/li&gt;
&lt;li&gt;
Camera: slightly better than nokia cameras (e.g. my 6610i, wife's old 7250i) don't look quite so much like they were taken through the bottom of a dirty jam jar. Still no match for a digital camera. 
&lt;/li&gt;
&lt;li&gt;
MP3 ringtones! Cool, was able to download the &lt;a href="http://www.jamster.co.uk/jiw/go?search=Crazy%20Frog&amp;tduid=980dae636efbdafe35f747502c07d388"&gt;crazy frog&lt;/a&gt; which has everyone in stitches. 
&lt;/li&gt;
&lt;li&gt;
Good build quality 
&lt;/li&gt;
&lt;li&gt;
The keyboard has a nicer feel than the Nokias which are a bit cheap and clicky. 
&lt;/li&gt;
&lt;li&gt;
The UI is rather like my late lamented Sony-ericsson T68i: fiddly and annoying. 
&lt;/li&gt;
&lt;li&gt;
Good predictive text: it quickly learns that you want to type 'am home' more often than 'an good'. 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
With the free phone I got 25% off a &lt;a href="http://www.jabra.com/JabraCMS/NA/EN/MainMenu/Products/WirelessHeadsets/JabraBT200/JabraBT200"&gt;Jabra BT200 FreeSpeak Bluetooth Headset&lt;/a&gt; and a car charger for &#163;5. 
&lt;/p&gt;
&lt;p&gt;
The Jabra headset Just Worked with the phone and it is indeed cool. My wife was delighted with it, she wants me to ring her whenever she goes out so she can pose with it. I set it up to voice dial and told her she can leave the phone in her handbag. 
&lt;/p&gt;
&lt;p&gt;
I wanted to try the headset with &lt;a href="http://www.skype.com"&gt;Skype&lt;/a&gt; so I tried reinstalling my existing bluetooth USB dongles: 
&lt;/p&gt;
&lt;dl&gt;&lt;dt&gt;Smart Modular Technologies&lt;/dt&gt;&lt;dd&gt;
I downloaded their latest blueopal drivers and installed them. On first installation the Audio drivers and some other bits failed to install. It did manage to install an OBEX network driver and I was able to copy files to and from the phone. This is how I installed the crazy frog .mp3 file which I downloaded above. (Am I missing something? Was I supposed to pay for it?). I tried reinstalling the blueopal drivers to get headset support and was rewarded with my first every &lt;a href="http://www.bsod.org/"&gt;BSOD&lt;/a&gt; under windows XP. The setup program kept trying to reinstall, giving more BSOD's so I had to uninstall it manually by deleting files and picking the nasty bits out of the registry by hand. 
&lt;/dl&gt;&lt;/dd&gt;

&lt;dl&gt;&lt;dt&gt;MicroStar  International (MSI) dongle&lt;/dt&gt;&lt;dd&gt;
Luckily I had an MSI dongle as well. I downloaded the latest SP1 drivers for this (carefully avoiding the XP SP2 version that uses the new Microsoft USB stack but that not support a headset, not until MS get into the VOIP business) and installed them with no problems. 
&lt;/dl&gt;&lt;/dd&gt;

&lt;p&gt;
The headset gives new microphone and audio devices so I redirected everything to the headset and again it Just Worked. Skype worked ok and talking to someone in the same room you can hear a delay of about a second between them speaking and it coming through the headset. Ragarding range, the MSI dongle is supposed to have a 100m range and with the laptop downstairs the headset can receive anywhere in the house, although at the furthest reaches the sound gets a bit choppy. I won't try Skype over Wifi, my Wifi is too flaky. 
&lt;/p&gt;
&lt;p&gt;
Peter's vision of the future (well maybe not that visionary): 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
full mp3 players in cell phones. If an iPod shuffle is the size of a stick of gum, why not make the cell phone a little bit bigger for a 500M flash memory chip? 
&lt;/li&gt;
&lt;li&gt;
death of land line phones, ripped apart by mobile phones and VOIP. 
&lt;/li&gt;
&lt;li&gt;
Nokia had better pull their fingers out, the V547 makes the Nokia phones look very dull. 
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Related Posts: &lt;a href="/tag/bluetooth"&gt;bluetooth&lt;/a&gt; &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/nokia"&gt;nokia&lt;/a&gt; &lt;a href="/tag/phone"&gt;phone&lt;/a&gt; &lt;a href="/tag/skype"&gt;skype&lt;/a&gt; &lt;a href="/tag/v547"&gt;v547&lt;/a&gt; &lt;a href="/tag/wifi"&gt;wifi&lt;/a&gt; &lt;a href="/tag/windows"&gt;windows&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/677</guid>
      <category domain="http://www.technorati.com/tag">bluetooth</category>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">nokia</category>
      <category domain="http://www.technorati.com/tag">phone</category>
      <category domain="http://www.technorati.com/tag">skype</category>
      <category domain="http://www.technorati.com/tag">v547</category>
      <category domain="http://www.technorati.com/tag">wifi</category>
      <category domain="http://www.technorati.com/tag">windows</category>
    </item>
    <item>
      <title>Peterserver is reborn</title>
      <link>http://www.petersblog.org/node/view/624</link>
      <description>&lt;p&gt;
Installed new linux system on my server. Actually I intend to use it as a TV... anyway I finally decided on a distribution. 
&lt;/p&gt;
&lt;p&gt;
 Gentoo: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
previous distribution 
&lt;/li&gt;
&lt;li&gt;
too much hard work and nursing and random breaking 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
 Knoppix: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
confused as to whether it is supposed to be installed and used or just booted from live CDs as a party trick 
&lt;/li&gt;
&lt;li&gt;
&lt;a href="/node/605"&gt;worked with my TV card&lt;/a&gt; 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
 Redhat: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
the MS of the linux world. Used 7.1 yonks ago and was not impressed. 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
 Suse: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
Used for a long time (6.1, 6.3) 
&lt;/li&gt;
&lt;li&gt;
Slow ftp servers however many years ago 
&lt;/li&gt;
&lt;li&gt;
Ended up compiling everything as I could never find rpm's 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
 Slackware: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
First ever distribution I tried, years ago, from a cover disk on a magazine 
&lt;/li&gt;
&lt;li&gt;
Is it still going? 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
 Ubuntu: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
related to Gnoppix and Debian 
&lt;/li&gt;
&lt;li&gt;
very hard to remember the spelling. I think of it as &lt;a href="http://www.umbongo.com/"&gt;umbongo&lt;/a&gt;. &lt;a href="http://www.umbongo.com/mp3/um_bongo_lo.mp3"&gt;Umbongo, Umbongo, they drink it in the congo&lt;/a&gt;. 
&lt;/li&gt;
&lt;li&gt;
tried live CD (600M, 2 hour bittorrent download) and PC went into a constant rebooting loop 
&lt;/li&gt;
&lt;li&gt;
tried installation CD (600M, 2 hour bittorrent download) and PC went into a constant rebooting loop 
&lt;/li&gt;
&lt;li&gt;
don't remember a linux installation ever failing so bad. 
&lt;/li&gt;
&lt;li&gt;
it's boot screen just shows Ubuntu, a logo and a progress bar: I want boot logs. 
&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;
Finally went back to Debian Woody: 
&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
It's low level enough for me without the Gentoo level of hastle and constant breaking. 
&lt;/li&gt;
&lt;li&gt;
I like apt: want to try something? It's installed in minutes. 
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Related Posts: &lt;a href="/tag/gentoo"&gt;gentoo&lt;/a&gt; &lt;a href="/tag/knoppix"&gt;knoppix&lt;/a&gt; &lt;a href="/tag/linux"&gt;linux&lt;/a&gt; &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/ubuntu"&gt;ubuntu&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/624</guid>
      <category domain="http://www.technorati.com/tag">gentoo</category>
      <category domain="http://www.technorati.com/tag">knoppix</category>
      <category domain="http://www.technorati.com/tag">linux</category>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">ubuntu</category>
    </item>
    <item>
      <title>Podcasting</title>
      <link>http://www.petersblog.org/node/view/504</link>
      <description>&lt;p&gt;
Had my first taste of a podcast. This is a kind of audio blog. The one I listened to was &lt;a href="http://www.engadget.com/entry/2004668467844323/"&gt;this&lt;/a&gt;. It comes across as being like a techy radio show, talking about mobile phones and the like. It was kind of interesting to listen to while I was on the rowing machine. I just downloaded the mp3 file and played it on the latest app to grab the association with mp3 files, Real Player in this case. 
&lt;/p&gt;
&lt;p&gt;
I could set up an aggregator capable of downloading these files as they appear and listen to them all the time but my rowing time is about the only time I have for this kind of thing. Rowing is like ironing, I need something interesting to watch on tv or listen to that will take my mind off my suffering. 
&lt;/p&gt;
&lt;p&gt;
Don't worry, I won't be generating podcasts any time soon. 
&lt;/p&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/blog"&gt;blog&lt;/a&gt; &lt;a href="/tag/mp3"&gt;mp3&lt;/a&gt; &lt;a href="/tag/rowing"&gt;rowing&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/504</guid>
      <category domain="http://www.technorati.com/tag">blog</category>
      <category domain="http://www.technorati.com/tag">mp3</category>
      <category domain="http://www.technorati.com/tag">rowing</category>
    </item>
  </channel>
</rss>
