#!/usr/bin/env python
""" CROSSFIT WOD
ROBERT WOLTERMAN (xtacocorex) - 2011
GRABS THE 5 CROSSFIT WORKOUT OF THE DAY (WOD)
*** MAKE SURE TO KEEP THE REFRESH RATE IN GEEKTOOL/NERDTOOL TO A SLOWER VALUE
"""
# CHANGELOG
# 09 SEPTEMBER 2011
# - FIGURED OUT BEST METHOD OF PARSING THE MESSY RSS FEED
# - ADDED COMMAND LINE OPTIONS FOR:
# - CONVERTING DATE FORMAT
# - UNDERLINING THE DATE HEADER
# - OUTPUTTING JUST THE WOD FOR THE CURRENT DAY
# -
# 31 JULY 2011
# - INITIAL WRITE (DIDN'T GET TOO FAR WITH THE CODE)
# MODULE IMPORTS
import urllib, os, re, sys, string, ast, optparse, time, datetime
from xml.dom.minidom import parse, parseString
FEEDURL = "http://feeds.feedburner.com/crossfit/eRTq"
class WOD:
def __init__(self):
self.wod_date = ""
self.wod = ""
def wodprint(self,opts):
if opts.underline:
print "\033[4m%s\033[0m" % date_check(self.wod_date,opts)
else:
print date_check(self.wod_date,opts)
print self.wod
print ""
def date_check(cdate,opts):
if opts.convert:
# SPLIT ON THE SPACE IN BETWEEN THE DAY NAME AND THE YYMMDD
tmp = cdate.split()
# GET THE DAY NAME
dayname = tmp[0]
# SPLIT UP THE YYMMDD
year = tmp[1][0:2]
month = tmp[1][2:4]
day = tmp[1][4:]
# SET UP OUR RETURN STRING
rtnstr = "%s %s/%s/%s" % (dayname,month,day,year)
# RETURN THE NEWLY FORMATTED DATE
return rtnstr
else:
# WE DON'T WANT TO CONVERT, SO RETURN THE INPUT ARGUMENT
return cdate
def cmdLineOptionParser():
"""
cmdLineOptionParser()
- PARSES THE COMMAND LINE ARGUMENTS
- INPUT: NONE
- OUPUTS: NONE
"""
# CREATE OUR USAGE REPSONSE
usage = ("%prog [options]",__doc__)
usage = "\n".join(usage)
# CREATE OUR COMMAND LINE PARSER
cmdparser = optparse.OptionParser(usage)
# ADD OPTIONS
cmdparser.add_option('-d', '--day', action='store_true',
help="Displays the WOD for the current day",
default=False
)
cmdparser.add_option('-a', '--all', action='store_true',
help="Displays all of the WODs in the feed",
default=False
)
cmdparser.add_option('-u', '--underline', action='store_true',
help="Underlines the day header(s)",
default=False
)
cmdparser.add_option('-c', '--convert', action='store_true',
help="Converts the date format from YYMMDD to MM/DD/YY",
default=False
)
# RETURN THE PARSER
return cmdparser
def getText(nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
# THE FOLLOWING TWO FUNCTIONS ARE FROM:
# http://love-python.blogspot.com/2008/07/strip-html-tags-using-python.html
# THEY WORK PERFECTLY
def remove_html_tags(data):
p = re.compile(r'<.*?>')
return p.sub('', data)
def remove_extra_spaces(data):
p = re.compile(r'\s+')
return p.sub(' ', data)
def getWOD(myopts):
"""
getWOD()
- GETS THE WORKOUT OF THE DAY DATA
- INPUT: myopts - option
- OUPUTS: NONE
"""
# CREATE TEMPORARY LIST
twodlist = []
# CREATE OUR DOM OBJECT TO GET THE HTML HIERARCHY
dom = parse(urllib.urlopen(FEEDURL))
# GET THE ITEMS TAG
feeditems = dom.getElementsByTagName("item")
# NOW LOOP THROUGH THE ITEMS AND GET THE TITLE AND DESCRIPTION
for items in feeditems:
# SET UP OUR TEMP WOD ITEM
twod = WOD()
# GET TITLE
tmp = items.getElementsByTagName("title")[0]
c_title = getText(tmp.childNodes)
twod.wod_date = c_title
#print twod.wod_date
# GET DESCRIPTION
tmp = items.getElementsByTagName("description")[0]
#tmp = remove_extra_spaces(remove_html_tags(getText(tmp.childNodes)))
tmp = remove_html_tags(getText(tmp.childNodes))
# ============
# THIS SECTION HAS THE CAPABILITY TO BREAK, CURRENTLY HAVE TO DO THE
# FOLLOWING STEPS IN THIS ORDER
# SEARCH FOR THE POST * TO COMMENTS AND GRAB EVERYTHING IN FRONT OF
# THAT TEXT FOR THE WOD
t3 = re.search(".*Post .* to comments.",tmp,re.DOTALL)
#print "t3: ", t3
if t3:
t2 = t3.group(0).split("Post")[0].rstrip("\n\n")
twod.wod = t2
#print t2
# DETERMINE IF IT IS A REST DAY, IF SO, OVERWRITE THE WOD WITH "REST DAY"
t1 = re.search(".*Rest Day.*",tmp,re.DOTALL)
#print "t1: ", t1
if t1:
#print "Rest Day"
twod.wod = "Rest Day"
# APPEND THE TEMP WOD ITEM TO THE TEMPORARY WOD LIST
twodlist.append(twod)
# RETURN THE WOD LIST
return twodlist
def printWODs(wodlist,opts):
"""
printWODs()
- PRINTS THE WODS TO THE SCREEN BASED ON THE USER CLI OPTIONS
- INPUT: opts - COMMAND LINE ARGUMENTS
- OUPUTS: NONE
"""
# GET CURRENT DATE IN THE SPECIAL FORMAT
currdate = time.strftime("%A %y%m%d")
# LOOP THROUGH THE WOD LIST AND START PRINTING
for item in wodlist:
# DETERMINE IF WE ARE PRINTING ALL OPTIONS OR JUST THE CURRENT DAYS
if opts.day:
if currdate == item.wod_date:
item.wodprint(opts)
elif opts.all:
item.wodprint(opts)
def wodGrabberMain(argv):
"""
wodGrabberMain()
- MAIN SCRIPT FUNCTION THAT ORGANIZES THE TASKS
- INPUT: args - COMMAND LINE ARGUMENTS
- OUPUTS: NONE
"""
# FIGURE OUT COMMAND LINE ARGUMENTS
cmdparser = cmdLineOptionParser()
opts, args = cmdparser.parse_args(argv)
# CREATE OUR LIST FOR STORING THE WODS
wodlist = []
# GET THE WODS
wodlist = getWOD(opts)
# PRINT THE WOD LIST
printWODs(wodlist,opts)
if __name__ == "__main__":
wodGrabberMain(sys.argv[1:])