def QueryContainer(self, handler, query): tsn = handler.headers.getheader('tsn', '') subcname = query['Container'][0] # If you are running 8.3 software you want to enable hack83 # in the config file if config.getHack83(): print '=' * 73 query, hackPath = self.hack(handler, query, subcname) hackPath = '/'.join(hackPath) print 'Tivo said:', subcname, '|| Hack said:', hackPath debug_write(__name__, fn_attr(), ['Tivo said: ', subcname, ' || Hack said: ', hackPath]) subcname = hackPath if not query: debug_write(__name__, fn_attr(), ['sending 302 redirect page']) handler.send_response(302) handler.send_header('Location ', 'http://' + handler.headers.getheader('host') + '/TiVoConnect?Command=QueryContainer&' + 'AnchorItem=Hack8.3&Container=' + hackPath) handler.end_headers() return # End hack mess cname = subcname.split('/')[0] if not handler.server.containers.has_key(cname) or \ not self.get_local_path(handler, query): handler.send_response(404) handler.end_headers() return container = handler.server.containers[cname] precache = container.get('precache', 'False').lower() == 'true' files, total, start = self.get_files(handler, query, self.video_file_filter) videos = [] local_base_path = self.get_local_base_path(handler, query) for file in files: mtime = datetime.fromtimestamp(os.stat(file).st_mtime) video = VideoDetails() video['captureDate'] = hex(int(time.mktime(mtime.timetuple()))) video['name'] = os.path.split(file)[1] video['path'] = file video['part_path'] = file.replace(local_base_path, '', 1) video['title'] = os.path.split(file)[1] video['is_dir'] = self.__isdir(file) if video['is_dir']: video['small_path'] = subcname + '/' + video['name'] video['total_items'] = self.__total_items(file) else: if precache or len(files) == 1 or file in transcode.info_cache: video['valid'] = transcode.supported_format(file) if video['valid']: video.update(self.__metadata_full(file, tsn)) else: video['valid'] = True video.update(self.__metadata_basic(file)) videos.append(video) handler.send_response(200) handler.end_headers() t = Template(file=os.path.join(SCRIPTDIR,'templates', 'container.tmpl')) t.container = cname t.name = subcname t.total = total t.start = start t.videos = videos t.quote = quote t.escape = escape t.crc = zlib.crc32 t.guid = config.getGUID() t.tivos = handler.tivos handler.wfile.write(t)
import config import time import mind from debug import debug_write, fn_attr SCRIPTDIR = os.path.dirname(__file__) CLASS_NAME = 'Video' extfile = os.path.join(SCRIPTDIR, 'video.ext') try: extensions = file(extfile).read().split() except: extensions = None if config.getHack83(): debug_write(__name__, fn_attr(), ['Hack83 is enabled.']) class Video(Plugin): CONTENT_TYPE = 'x-container/tivo-videos' # Used for 8.3's broken requests count = 0 request_history = {} def pre_cache(self, full_path): if Video.video_file_filter(self, full_path): transcode.supported_format(full_path) def video_file_filter(self, full_path, type=None):
def QueryContainer(self, handler, query): tsn = handler.headers.getheader('tsn', '') subcname = query['Container'][0] # If you are running 8.3 software you want to enable hack83 # in the config file if config.getHack83(): print '=' * 73 query, hackPath = self.hack(handler, query, subcname) hackPath = '/'.join(hackPath) print 'Tivo said:', subcname, '|| Hack said:', hackPath debug_write(__name__, fn_attr(), ['Tivo said: ', subcname, ' || Hack said: ', hackPath]) subcname = hackPath if not query: debug_write(__name__, fn_attr(), ['sending 302 redirect page']) handler.send_response(302) handler.send_header( 'Location ', 'http://' + handler.headers.getheader('host') + '/TiVoConnect?Command=QueryContainer&' + 'AnchorItem=Hack8.3&Container=' + hackPath) handler.end_headers() return # End hack mess cname = subcname.split('/')[0] if not handler.server.containers.has_key(cname) or \ not self.get_local_path(handler, query): handler.send_response(404) handler.end_headers() return container = handler.server.containers[cname] precache = container.get('precache', 'False').lower() == 'true' files, total, start = self.get_files(handler, query, self.video_file_filter) videos = [] local_base_path = self.get_local_base_path(handler, query) for file in files: mtime = datetime.fromtimestamp(os.stat(file).st_mtime) video = VideoDetails() video['captureDate'] = hex(int(time.mktime(mtime.timetuple()))) video['name'] = os.path.split(file)[1] video['path'] = file video['part_path'] = file.replace(local_base_path, '', 1) video['title'] = os.path.split(file)[1] video['is_dir'] = self.__isdir(file) if video['is_dir']: video['small_path'] = subcname + '/' + video['name'] video['total_items'] = self.__total_items(file) else: if precache or len(files) == 1 or file in transcode.info_cache: video['valid'] = transcode.supported_format(file) if video['valid']: video.update(self.__metadata_full(file, tsn)) else: video['valid'] = True video.update(self.__metadata_basic(file)) videos.append(video) handler.send_response(200) handler.end_headers() t = Template( file=os.path.join(SCRIPTDIR, 'templates', 'container.tmpl')) t.container = cname t.name = subcname t.total = total t.start = start t.videos = videos t.quote = quote t.escape = escape t.crc = zlib.crc32 t.guid = config.getGUID() t.tivos = handler.tivos handler.wfile.write(t)
import time, os, BaseHTTPServer, SocketServer, socket, re from urllib import unquote_plus, quote, unquote from urlparse import urlparse from cgi import parse_qs from Cheetah.Template import Template from plugin import GetPlugin import config from xml.sax.saxutils import escape from debug import debug_write, fn_attr SCRIPTDIR = os.path.dirname(__file__) hack83 = config.getHack83() class TivoHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): containers = {} def __init__(self, server_address, RequestHandlerClass): BaseHTTPServer.HTTPServer.__init__(self, server_address, RequestHandlerClass) self.daemon_threads = True def add_container(self, name, settings): if self.containers.has_key(name) or name == 'TiVoConnect': raise "Container Name in use" try: settings['content_type'] = GetPlugin(settings['type']).CONTENT_TYPE self.containers[name] = settings except KeyError: print 'Unable to add container', name
import config import time import mind from debug import debug_write, fn_attr SCRIPTDIR = os.path.dirname(__file__) CLASS_NAME = 'Video' extfile = os.path.join(SCRIPTDIR, 'video.ext') try: extensions = file(extfile).read().split() except: extensions = None if config.getHack83(): debug_write(__name__, fn_attr(), ['Hack83 is enabled.']) class Video(Plugin): CONTENT_TYPE = 'x-container/tivo-videos' # Used for 8.3's broken requests count = 0 request_history = {} def pre_cache(self, full_path): if Video.video_file_filter(self, full_path): transcode.supported_format(full_path)