15__title__ =
"cinemarv_api - XPath and XSLT functions for the CinemaRV.com grabber"
16__author__=
"R.D. Vaughan"
18This python script is intended to perform a variety of utility functions
19for the conversion of data to the MNV standard RSS output format.
20See this link for the specifications:
21http://www.mythtv.org/wiki/MythNetvision_Grabber_Script_Format
29__xpathClassList__ = [
'xpathFunctions', ]
33__xsltExtentionList__ = []
35import os, sys, re, time, datetime, shutil,
urllib.request, urllib.parse, urllib.error, string
36from copy
import deepcopy
40 """Wraps a stream with an encoder"""
49 """Wraps the output stream, encoding Unicode strings with the specified encoding"""
50 if isinstance(obj, str):
53 self.
out.buffer.write(obj)
58 """Delegate everything but write to the stream"""
59 return getattr(self.
out, attr)
61if isinstance(sys.stdout, io.TextIOWrapper):
66 from io
import StringIO
67 from lxml
import etree
69 sys.stderr.write(
'\n! Error - Importing the "lxml" and "StringIO" python libraries failed on error(%s)\n' % e)
74 """Functions specific extending XPath
77 self.
functList = [
'cinemarvLinkGeneration',
'cinemarvIsCustomHTML',
'cinemarvCheckIfDBItem', ]
89 '''Generate a link for the CinemaRV.com site. A read of the item's web page is required to
90 extract the flash video id.
91 Call example: 'mnvXpath:cinemarvLinkGeneration(string(link))'
97 if self.
persistence[
'cinemarvLinkGeneration']
is not None:
98 returnValue = self.
persistence[
'cinemarvLinkGeneration']
102 self.
persistence[
'cinemarvLinkGenerationVideoID'] = etree.XPath(
'//object[@id="flashObj"]//param[@name="flashVars"]/@value', namespaces=common.namespaces)
103 self.
persistence[
'cinemarvLinkGenerationParser'] = etree.HTMLParser()
106 webPageElement = etree.parse(webURL, self.
persistence[
'cinemarvLinkGenerationParser'])
107 except Exception
as errmsg:
108 sys.stderr.write(
'!Warning: The web page URL(%s) could not be read, error(%s)\n' % (webURL, errmsg))
110 if webPageElement
is None:
111 self.
persistence[
'cinemarvLinkGeneration'] = webURL
114 tmpVideoID = self.
persistence[
'cinemarvLinkGenerationVideoID'](webPageElement)
115 if not len(tmpVideoID):
116 self.
persistence[
'cinemarvLinkGeneration'] = webURL
118 index = tmpVideoID[0].
find(
'&')
120 self.
persistence[
'cinemarvLinkGeneration'] = webURL
122 videocode = tmpVideoID[0][:index].replace(
'videoId=',
'')
123 self.
persistence[
'cinemarvLinkGeneration'] = common.linkWebPage(
'dummycontext',
'cinemarv')+videocode
128 '''Check if the link is for a custom HTML
130 return True if the link does
not starts
with "http://"
131 return False if the link starts
with "http://"
133 if self.
persistence[
'cinemarvLinkGeneration']
is None:
136 if self.
persistence[
'cinemarvLinkGeneration'].startswith(
'http://'):
143 '''Use a unique key value pairing to find out if the 'internetcontentarticles' table already
144 has a matching item. This is done to save accessing the Internet when
not required.
145 Call example:
'mnvXpath:cinemarvCheckIfDBItem(.)'
146 return True if a match was found
147 return False if a match was
not found
149 return common.checkIfDBItem(
'dummy', {
'feedtitle':
'Movie Trailers',
'title': arg[0].replace(
'Trailer',
'').strip(),
'author': arg[1],
'description': arg[2]})
def __getattr__(self, attr)
def __init__(self, outstream, encoding=None)
def cinemarvLinkGeneration(self, context, *args)
Start of XPath extension functions.
def cinemarvCheckIfDBItem(self, context, *arg)
def cinemarvIsCustomHTML(self, context, *args)
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)