MythTV master
technology.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2# -*- coding: UTF-8 -*-
3# ----------------------
4# Name: technology.py
5# Python Script
6# Author: R.D. Vaughan
7# Purpose:
8# This python script is intended to perform a mashup of various Technology Internet media sources
9# for the MythTV Netvision plugin. It follows the MythTV Netvision grabber standards.
10#
11# Command example:
12# See help (-u and -h) options
13#
14# Design:
15# 1) Read "~/.mythtv/MythNetvision/userGrabberPrefs/technologyMashup.xml" configuration file
16# 2) Input the sources that are marked as enabled
17# 3) Process the results and display to stdout
18#
19#
20# License:Creative Commons GNU GPL v2
21# (http://creativecommons.org/licenses/GPL/2.0/)
22#-------------------------------------
23__title__ ="Technology";
24__mashup_title__ = "technologyMashup"
25__author__="R.D. Vaughan"
26__version__="0.10"
27# 0.10 Initial development
28
29__usage_examples__ ='''
30(Option Help)
31> ./technology.py -h
32Usage: ./technology.py -hduvlST [parameters] <search text>
33Version: v0.XX Author: R.D.Vaughan
34
35For details on the MythTV Netvision plugin see the wiki page at:
36http://www.mythtv.org/wiki/MythNetvision
37
38Options:
39 -h, --help show this help message and exit
40 -d, --debug Show debugging info (URLs, raw XML ... etc, info
41 varies per grabber)
42 -u, --usage Display examples for executing the script
43 -v, --version Display grabber name and supported options
44 -l LANGUAGE, --language=LANGUAGE
45 Select data that matches the specified language fall
46 back to English if nothing found (e.g. 'es' EspaƱol,
47 'de' Deutsch ... etc). Not all sites or grabbers
48 support this option.
49 -p PAGE NUMBER, --pagenumber=PAGE NUMBER
50 Display specific page of the search results. Default
51 is page 1. Page number is ignored with the Tree View
52 option (-T).
53 -T, --treeview Display a Tree View of a sites videos
54
55> ./technology.py -v
56<grabber>
57 <name>Technology</name>
58 <author>R.D. Vaughan</author>
59 <thumbnail>technology.png</thumbnail>
60 <command>technology.py</command>
61 <type>video</type>
62 <description>Mashups combines media from multiple sources to create a new work</description>
63 <version>0.XX</version>
64 <search>true</search>
65 <tree>true</tree>
66</grabber>
67
68Search:
69> ./technology.py -S "Video"
70
71Treeview:
72> ./technology.py -T
73'''
74__search_max_page_items__ = 20
75__tree_max_page_items__ = 20
76
77import sys, os
78import io
79
80class OutStreamEncoder(object):
81 """Wraps a stream with an encoder"""
82 def __init__(self, outstream, encoding=None):
83 self.out = outstream
84 if not encoding:
85 self.encoding = sys.getfilesystemencoding()
86 else:
87 self.encoding = encoding
88
89 def write(self, obj):
90 """Wraps the output stream, encoding Unicode strings with the specified encoding"""
91 if isinstance(obj, str):
92 obj = obj.encode(self.encoding)
93 self.out.buffer.write(obj)
94
95 def __getattr__(self, attr):
96 """Delegate everything but write to the stream"""
97 return getattr(self.out, attr)
98
99if isinstance(sys.stdout, io.TextIOWrapper):
100 sys.stdout = OutStreamEncoder(sys.stdout, 'utf8')
101 sys.stderr = OutStreamEncoder(sys.stderr, 'utf8')
102
103
104# Used for debugging
105#import nv_python_libs.common.common_api
106try:
107 '''Import the common python class
108 '''
109 import nv_python_libs.common.common_api as common_api
110except Exception as e:
111 sys.stderr.write('''
112The subdirectory "nv_python_libs/common" containing the modules common_api.py and
113common_exceptions.py (v0.1.3 or greater),
114They should have been included with the distribution of MythNetvision
115Error(%s)
116''' % e)
117 sys.exit(1)
118if common_api.__version__ < '0.1.3':
119 sys.stderr.write("\n! Error: Your current installed common_api.py version is (%s)\nYou must at least have version (0.1.3) or higher.\n" % target.__version__)
120 sys.exit(1)
121
122
123# Used for debugging
124#import nv_python_libs.mashups.mashups_api as target
125try:
126 '''Import the python mashups support classes
127 '''
129except Exception as e:
130 sys.stderr.write('''
131The subdirectory "nv_python_libs/mashups" containing the modules mashups_api and
132mashups_exceptions.py (v0.1.0 or greater),
133They should have been included with the distribution of technology.py.
134Error(%s)
135''' % e)
136 sys.exit(1)
137if target.__version__ < '0.1.0':
138 sys.stderr.write("\n! Error: Your current installed mashups_api.py version is (%s)\nYou must at least have version (0.1.0) or higher.\n" % target.__version__)
139 sys.exit(1)
140
141# Verify that the main process modules are installed and accessible
142try:
143 import nv_python_libs.mainProcess as process
144except Exception as e:
145 sys.stderr.write('''
146The python script "nv_python_libs/mainProcess.py" must be present.
147Error(%s)
148''' % e)
149 sys.exit(1)
150
151if process.__version__ < '0.2.0':
152 sys.stderr.write("\n! Error: Your current installed mainProcess.py version is (%s)\nYou must at least have version (0.2.0) or higher.\n" % process.__version__)
153 sys.exit(1)
154
155if __name__ == '__main__':
156 # No api key is required
157 apikey = ""
158 # Set the base processing directory that the grabber is installed
159 target.baseProcessingDir = os.path.dirname( os.path.realpath( __file__ ))
160 # Make sure the target functions have an instance of the common routines
161 target.common = common_api.Common()
162 main = process.mainProcess(target, apikey, )
163 main.grabberInfo = {}
164 main.grabberInfo['enabled'] = True
165 main.grabberInfo['title'] = __title__
166 main.grabberInfo['command'] = 'technology.py'
167 main.grabberInfo['mashup_title'] = __mashup_title__
168 main.grabberInfo['author'] = __author__
169 main.grabberInfo['thumbnail'] = 'technology.png'
170 main.grabberInfo['type'] = ['video', ]
171 main.grabberInfo['desc'] = "Mashups combines media from multiple sources to create a new work"
172 main.grabberInfo['version'] = __version__
173 # Check if there are any Nature items in the DB to to actually search
174 main.grabberInfo['search'] = target.common.checkIfDBItem('dummy', {'feedtitle': __title__, })
175 main.grabberInfo['tree'] = True
176 main.grabberInfo['html'] = False
177 main.grabberInfo['usage'] = __usage_examples__
178 main.grabberInfo['SmaxPage'] = __search_max_page_items__
179 main.grabberInfo['TmaxPage'] = __tree_max_page_items__
180 main.main()
def __init__(self, outstream, encoding=None)
Definition: technology.py:82
def __getattr__(self, attr)
Definition: technology.py:95