#!/usr/bin/env python
import os
import md5
from urllib import URLopener
from urllib2 import urlopen
from xml.dom.minidom import parseString

rss_feeds = {}

#
# Comment / Uncomment the following lines to use the required feeds
#
rss_feeds['chromasia'] = 'http://deskfeed.neophytou.net/rss/chromasia'
rss_feeds['ddoi'] = 'http://deskfeed.neophytou.net/rss/ddoi'

dst_dir = os.path.expanduser('~/Pictures/DeskFeed/')

# Based on script found at HackerMoJo.com
# http://hackermojo.com/mt-static/archives/2008/04/metropulse-launched.html
def parseFeed(rss):
  try:
    rss_contents = urlopen( rss )
  except:
    print "Failed to read rss feed %s" % rss
    return
  rss_src = rss_contents.read()
  rss_contents.close()
  dom = parseString( rss_src )
  node_lst = dom.getElementsByTagName('item')
  items = range(node_lst.length)
  hashes = {}
  group = node_lst.item(0).getElementsByTagName('title')[0].getAttribute('group')
  # Store the md5 hashes of all the saved photos
  for i in items:
    img_filename = "%s%s_%s.jpg" % (dst_dir,group,i)
    try:
      image_file = open(img_filename, "r")
      hashes[img_filename] = md5.md5(image_file.read()).hexdigest()
      image_file.close()
    except IOError:
      hashes[img_filename] = ""
      pass
  # Go through all the photos in the rss feed, in reverse order
  items.reverse()
  for i in items:
    element = node_lst.item(i)
    group = element.getElementsByTagName( 'title' )[0].getAttribute('group')
    link = element.getElementsByTagName( 'link' )[0].getAttribute('source')
    photo_hash = element.getElementsByTagName('hash')[0].firstChild.data
    img_filename = "%s%s_%s.jpg" % (dst_dir, group, i)
    # Check all the saved photos and see if any of them have the same hash
    for j in range(i):
      old_img_filename = "%s%s_%s.jpg" % (dst_dir, group, j)
      if (hashes[old_img_filename] == photo_hash):
        # If one does, give it the current photo filename
        os.system("mv %s %s" % (old_img_filename, img_filename))
        hashes[old_img_filename] = ""
        hashes[img_filename] = photo_hash
        break
    try:
      image_file = open(img_filename, "r")
      old_hash = md5.md5(image_file.read()).hexdigest()
      image_file.close()
      if (old_hash == photo_hash):
        continue
    except IOError:
      pass
    try:
      URLopener().retrieve(link, img_filename)
    except IOError:
      continue

def main():
  for key in rss_feeds:
    parseFeed(rss_feeds[key])

if __name__ == "__main__":
  main()

