00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 __title__ ="traileraddicts_api - XPath and XSLT functions for the TrailerAddicts.com grabber"
00016 __author__="R.D. Vaughan"
00017 __purpose__='''
00018 This python script is intended to perform a variety of utility functions
00019 for the conversion of data to the MNV standard RSS output format.
00020 See this link for the specifications:
00021 http://www.mythtv.org/wiki/MythNetvision_Grabber_Script_Format
00022 '''
00023
00024 __version__="v0.1.0"
00025
00026
00027
00028
00029 __xpathClassList__ = ['xpathFunctions', ]
00030
00031
00032
00033 __xsltExtentionList__ = []
00034
00035 import os, sys, re, time, datetime, shutil, urllib, string
00036 from copy import deepcopy
00037
00038
00039 class OutStreamEncoder(object):
00040 """Wraps a stream with an encoder"""
00041 def __init__(self, outstream, encoding=None):
00042 self.out = outstream
00043 if not encoding:
00044 self.encoding = sys.getfilesystemencoding()
00045 else:
00046 self.encoding = encoding
00047
00048 def write(self, obj):
00049 """Wraps the output stream, encoding Unicode strings with the specified encoding"""
00050 if isinstance(obj, unicode):
00051 try:
00052 self.out.write(obj.encode(self.encoding))
00053 except IOError:
00054 pass
00055 else:
00056 try:
00057 self.out.write(obj)
00058 except IOError:
00059 pass
00060
00061 def __getattr__(self, attr):
00062 """Delegate everything but write to the stream"""
00063 return getattr(self.out, attr)
00064 sys.stdout = OutStreamEncoder(sys.stdout, 'utf8')
00065 sys.stderr = OutStreamEncoder(sys.stderr, 'utf8')
00066
00067 try:
00068 from StringIO import StringIO
00069 from lxml import etree
00070 except Exception, e:
00071 sys.stderr.write(u'\n! Error - Importing the "lxml" and "StringIO" python libraries failed on error(%s)\n' % e)
00072 sys.exit(1)
00073
00074
00075
00076
00077
00078 version = ''
00079 for digit in etree.LIBXML_VERSION:
00080 version+=str(digit)+'.'
00081 version = version[:-1]
00082 if version < '2.7.2':
00083 sys.stderr.write(u'''
00084 ! Error - The installed version of the "lxml" python library "libxml" version is too old.
00085 At least "libxml" version 2.7.2 must be installed. Your version is (%s).
00086 ''' % version)
00087 sys.exit(1)
00088
00089
00090 class xpathFunctions(object):
00091 """Functions specific extending XPath
00092 """
00093 def __init__(self):
00094 self.functList = ['traileraddictsLinkGenerationMovie', 'traileraddictsLinkGenerationClip', 'traileraddictsCheckIfDBItem']
00095 self.TextTail = etree.XPath("string()")
00096 self.persistence = {}
00097
00098
00099
00100
00101
00102
00103
00104
00105 def traileraddictsLinkGenerationMovie(self, context, *args):
00106 '''Generate a link for the TrailerAddicts.com site.
00107 Call example: 'mnvXpath:traileraddictsLinkGenerationMovie(position(), link)'
00108 return the url link
00109 '''
00110 webURL = args[1].strip()
00111
00112
00113 if self.persistence.has_key('traileraddictsLinkGenerationMovie'):
00114 if args[0] == self.persistence['traileraddictsLinkGenerationMovie']['position']:
00115 return self.persistence['traileraddictsLinkGenerationMovie']['link']
00116 else:
00117 self.persistence['traileraddictsLinkGenerationMovie'] = {}
00118 self.persistence['traileraddictsLinkGenerationMovie']['embedRSS'] = etree.parse(u'http://www.traileraddict.com/embedrss', common.parsers['xml'].copy())
00119 self.persistence['traileraddictsLinkGenerationMovie']['matchlink'] = etree.XPath('//link[string()=$link]/..', namespaces=common.namespaces)
00120 self.persistence['traileraddictsLinkGenerationMovie']['description'] = etree.XPath('normalize-space(description)', namespaces=common.namespaces)
00121 self.persistence['traileraddictsLinkGenerationMovie']['embedded'] = etree.XPath('//embed/@src', namespaces=common.namespaces)
00122
00123 self.persistence['traileraddictsLinkGenerationMovie']['position'] = args[0]
00124
00125 matchLink = self.persistence['traileraddictsLinkGenerationMovie']['matchlink'](self.persistence['traileraddictsLinkGenerationMovie']['embedRSS'], link=webURL)[0]
00126 self.persistence['traileraddictsLinkGenerationMovie']['link'] = self.persistence['traileraddictsLinkGenerationMovie']['embedded'](common.getHtmlData(u'dummy',(self.persistence['traileraddictsLinkGenerationMovie']['description'](matchLink))))[0]
00127
00128 return self.persistence['traileraddictsLinkGenerationMovie']['link']
00129
00130
00131
00132 def traileraddictsLinkGenerationClip(self, context, *args):
00133 '''Generate a link for the TrailerAddicts.com site.
00134 Call example: 'mnvXpath:traileraddictsLinkGenerationClip(position(), link)'
00135 return the url link
00136 '''
00137 webURL = args[1].strip()
00138
00139 if self.persistence.has_key('traileraddictsLinkGenerationClip'):
00140 if args[0] == self.persistence['traileraddictsLinkGenerationClip']['position']:
00141 return self.persistence['traileraddictsLinkGenerationClip']['link']
00142 else:
00143 self.persistence['traileraddictsLinkGenerationClip'] = {}
00144 self.persistence['traileraddictsLinkGenerationClip']['embedded'] = etree.XPath('//embed[@allowfullscreen="true"]/@src', namespaces=common.namespaces)
00145
00146 self.persistence['traileraddictsLinkGenerationClip']['position'] = args[0]
00147
00148 tmpHTML = etree.parse(webURL, etree.HTMLParser())
00149 self.persistence['traileraddictsLinkGenerationClip']['link'] = self.persistence['traileraddictsLinkGenerationClip']['embedded'](tmpHTML)[0]
00150 return self.persistence['traileraddictsLinkGenerationClip']['link']
00151
00152
00153 def traileraddictsCheckIfDBItem(self, context, *arg):
00154 '''Use a unique key value pairing to find out if the 'internetcontentarticles' table already
00155 has a matching item. This is done to save accessing the Internet when not required.
00156 Call example: 'mnvXpath:traileraddictsCheckIfDBItem(.)'
00157 return True if a match was found
00158 return False if a match was not found
00159 '''
00160 return common.checkIfDBItem('dummy', {'feedtitle': 'Movie Trailers', 'title': arg[0], 'author': arg[1], 'description': arg[2]})
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180