15__title__ =
"revision3XSL_api - XPath and XSLT functions for the www.revision3L.com RSS/HTML"
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 = [
'revision3LinkGeneration',
'revision3Episode',
'revision3checkIfDBItem', ]
79 re.compile(
'''^.+?\\-\\-(?P<episodeno>[0-9]+)\\-\\-.*$''', re.UNICODE),
82 'atom':
"http://www.w3.org/2005/Atom",
83 'media':
"http://search.yahoo.com/mrss/",
84 'itunes':
"http://www.itunes.com/dtds/podcast-1.0.dtd",
85 'xhtml':
"http://www.w3.org/1999/xhtml",
86 'mythtv':
"http://www.mythtv.org/wiki/MythNetvision_Grabber_Script_Format",
87 'cnettv':
"http://cnettv.com/mrss/",
88 'creativeCommons':
"http://backend.userland.com/creativeCommonsRssModule",
89 'amp':
"http://www.adobe.com/amp/1.0",
90 'content':
"http://purl.org/rss/1.0/modules/content/",
93 [etree.XPath(
'//object/@id', namespaces=self.
namespaces ),
None],
95 self.
FullScreen =
'http://revision3.com/show/popupPlayer?video_id=%s&quality=high&offset=0'
106 '''Generate a link for the video.
107 Call example: 'mnvXpath:revision3LinkGeneration(string(link))'
113 except Exception
as errmsg:
114 sys.stderr.write(
"Error reading url(%s) error(%s)\n" % (webURL, errmsg))
124 videocode = match.groups()
127 return self.
FullScreen % (mediaId[0].strip().replace(
'player-',
''))
133 '''Parse the download link and extract an episode number
134 Call example: 'mnvXpath:revision3Episode(.)'
135 return the a massaged title element
and an episode element
in an array
137 title = arg[0][0].find('title').text
138 link = arg[0][0].
find(
'enclosure').attrib[
'url']
144 episodeNumber = int(match.groups()[0])
146 titleElement = etree.XML(
"<xml></xml>")
147 etree.SubElement(titleElement,
"title").text =
'Ep%03d: %s' % (episodeNumber, title)
149 etree.SubElement(titleElement,
"episode").text =
'%s' % episodeNumber
150 return [titleElement]
154 '''Use a unique key value pairing to find out if the 'internetcontentarticles' table already
155 has a matching item. This is done to save accessing the Internet when
not required.
156 Call example:
'mnvXpath:revision3checkIfDBItem(.)'
157 return True if a match was found
158 return False if a match was
not found
160 return common.checkIfDBItem(
'dummy', {
'title': self.
revision3Episode(context, arg)[0].
find(
'title').text, })
def __getattr__(self, attr)
def __init__(self, outstream, encoding=None)
def revision3checkIfDBItem(self, context, arg)
def revision3Episode(self, context, *arg)
def revision3LinkGeneration(self, context, *arg)
Start of XPath extension functions.
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)
MBASE_PUBLIC long long copy(QFile &dst, QFile &src, uint block_size=0)
Copies src file to dst file.