def handle_query(self, query, tsn): mname = False if 'Command' in query and len(query['Command']) >= 1: command = query['Command'][0] # If we are looking at the root container if (command == 'QueryContainer' and (not 'Container' in query or query['Container'][0] == '/')): self.root_container() return if 'Container' in query: # Dispatch to the container plugin basepath = query['Container'][0].split('/')[0] if self.do_command(query, command, basepath, tsn): return elif command == 'QueryItem': path = query.get('Url', [''])[0] splitpath = [x for x in unquote_plus(path).split('/') if x] if splitpath and not '..' in splitpath: if self.do_command(query, command, splitpath[0], tsn): return elif (command == 'QueryFormats' and 'SourceFormat' in query and query['SourceFormat'][0].startswith('video')): if config.hasTStivo(tsn): self.send_xml(VIDEO_FORMATS_TS) else: self.send_xml(VIDEO_FORMATS) return elif command == 'QueryServer': self.send_xml(SERVER_INFO) return elif command in ('FlushServer', 'ResetServer'): # Does nothing -- included for completeness self.send_response(200) self.end_headers() return # If we made it here it means we couldn't match the request to # anything. self.unsupported(query)
def handle_query(self, query, tsn): mname = False if 'Command' in query and len(query['Command']) >= 1: command = query['Command'][0] # If we are looking at the root container if (command == 'QueryContainer' and (not 'Container' in query or query['Container'][0] == '/')): self.root_container() return if 'Container' in query: # Dispatch to the container plugin basepath = query['Container'][0].split('/')[0] for name, container in config.getShares(tsn): if basepath == name: plugin = GetPlugin(container['type']) if hasattr(plugin, command): method = getattr(plugin, command) method(self, query) return else: break elif (command == 'QueryFormats' and 'SourceFormat' in query and query['SourceFormat'][0].startswith('video')): self.send_response(200) self.send_header('Content-type', 'text/xml') self.end_headers() if config.hasTStivo(tsn): self.wfile.write(VIDEO_FORMATS_TS) else: self.wfile.write(VIDEO_FORMATS) return elif command == 'FlushServer': # Does nothing -- included for completeness self.send_response(200) self.end_headers() return # If we made it here it means we couldn't match the request to # anything. self.unsupported(query)
def QueryContainer(self, handler, query): tsn = handler.headers.getheader('tsn', '') subcname = query['Container'][0] useragent = handler.headers.getheader('User-Agent', '') if not self.get_local_path(handler, query): handler.send_error(404) return container = handler.container precache = container.get('precache', 'False').lower() == 'true' force_alpha = container.get('force_alpha', 'False').lower() == 'true' use_html = query.get('Format', [''])[0].lower() == 'text/html' files, total, start = self.get_files(handler, query, self.video_file_filter, force_alpha) videos = [] local_base_path = self.get_local_base_path(handler, query) for f in files: video = VideoDetails() mtime = f.mdate try: ltime = time.localtime(mtime) except: logger.warning('Bad file time on ' + unicode(f.name, 'utf-8')) mtime = int(time.time()) ltime = time.localtime(mtime) video['captureDate'] = hex(mtime) video['textDate'] = time.strftime('%b %d, %Y', ltime) video['name'] = os.path.basename(f.name) video['path'] = f.name video['part_path'] = f.name.replace(local_base_path, '', 1) if not video['part_path'].startswith(os.path.sep): video['part_path'] = os.path.sep + video['part_path'] video['title'] = os.path.basename(f.name) video['is_dir'] = f.isdir if video['is_dir']: video['small_path'] = subcname + '/' + video['name'] video['total_items'] = self.__total_items(f.name) else: if precache or len(files) == 1 or f.name in transcode.info_cache: video['valid'] = transcode.supported_format(f.name) if video['valid']: video.update(self.metadata_full(f.name, tsn)) if len(files) == 1: video['captureDate'] = hex(isogm(video['time'])) else: video['valid'] = True video.update(metadata.basic(f.name)) if config.hasTStivo(tsn): video['mime'] = 'video/x-tivo-mpeg-ts' else: video['mime'] = 'video/x-tivo-mpeg' video['textSize'] = ( '%.3f GB' % (float(f.size) / (1024 ** 3)) ) videos.append(video) logger.debug('mobileagent: %d useragent: %s' % (useragent.lower().find('mobile'), useragent.lower())) use_mobile = useragent.lower().find('mobile') > 0 if use_html: if use_mobile: t = Template(HTML_CONTAINER_TEMPLATE_MOBILE, filter=EncodeUnicode) else: t = Template(HTML_CONTAINER_TEMPLATE, filter=EncodeUnicode) else: t = Template(XML_CONTAINER_TEMPLATE, filter=EncodeUnicode) t.container = handler.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 = config.tivos t.tivo_names = config.tivo_names if use_html: handler.send_html(str(t)) else: handler.send_xml(str(t))
def NPL(self, handler, query): global basic_meta shows_per_page = 50 # Change this to alter the number of shows returned folder = '' has_tivodecode = bool(config.get_bin('tivodecode')) if 'TiVo' in query: tivoIP = query['TiVo'][0] tsn = config.tivos_by_ip(tivoIP) togo_mpegts = config.hasTStivo(tsn) useragent = handler.headers.getheader('User-Agent', '') tivo_name = config.tivo_names[tsn] tivo_mak = config.get_tsn('tivo_mak', tsn) theurl = ('https://' + tivoIP + '/TiVoConnect?Command=QueryContainer&ItemCount=' + str(shows_per_page) + '&Container=/NowPlaying') if 'Folder' in query: folder += query['Folder'][0] theurl += '/' + folder if 'AnchorItem' in query: theurl += '&AnchorItem=' + quote(query['AnchorItem'][0]) if 'AnchorOffset' in query: theurl += '&AnchorOffset=' + query['AnchorOffset'][0] if (theurl not in tivo_cache or (time.time() - tivo_cache[theurl]['thepage_time']) >= 60): # if page is not cached or old then retreive it auth_handler.add_password('TiVo DVR', tivoIP, 'tivo', tivo_mak) try: page = self.tivo_open(theurl) except IOError, e: handler.redir(UNABLE % tivoIP, 10) return tivo_cache[theurl] = {'thepage': minidom.parse(page), 'thepage_time': time.time()} page.close() xmldoc = tivo_cache[theurl]['thepage'] items = xmldoc.getElementsByTagName('Item') TotalItems = tag_data(xmldoc, 'Details/TotalItems') ItemStart = tag_data(xmldoc, 'ItemStart') ItemCount = tag_data(xmldoc, 'ItemCount') FirstAnchor = tag_data(items[0], 'Links/Content/Url') data = [] for item in items: entry = {} entry['ContentType'] = tag_data(item, 'ContentType') for tag in ('CopyProtected', 'UniqueId'): value = tag_data(item, tag) if value: entry[tag] = value if entry['ContentType'] == 'x-tivo-container/folder': entry['Title'] = tag_data(item, 'Title') entry['TotalItems'] = tag_data(item, 'TotalItems') lc = tag_data(item, 'LastCaptureDate') if not lc: lc = tag_data(item, 'LastChangeDate') entry['LastChangeDate'] = time.strftime('%b %d, %Y', time.localtime(int(lc, 16))) else: keys = {'Icon': 'Links/CustomIcon/Url', 'Url': 'Links/Content/Url', 'SourceSize': 'Details/SourceSize', 'Duration': 'Details/Duration', 'CaptureDate': 'Details/CaptureDate'} for key in keys: value = tag_data(item, keys[key]) if value: entry[key] = value entry['SourceSize'] = ( '%.3f GB' % (float(entry['SourceSize']) / (1024 ** 3)) ) dur = int(entry['Duration']) / 1000 entry['Duration'] = ( '%02d:%02d:%02d' % (dur / 3600, (dur % 3600) / 60, dur % 60) ) entry['CaptureDate'] = time.strftime('%b %d, %Y', time.localtime(int(entry['CaptureDate'], 16))) url = entry['Url'] if url in basic_meta: entry.update(basic_meta[url]) else: basic_data = metadata.from_container(item) entry.update(basic_data) basic_meta[url] = basic_data data.append(entry)
def QueryContainer(self, handler, query): tsn = handler.headers.getheader('tsn', '') subcname = query['Container'][0] if not self.get_local_path(handler, query): handler.send_error(404) return container = handler.container precache = container.get('precache', 'False').lower() == 'true' force_alpha = container.get('force_alpha', 'False').lower() == 'true' use_html = query.get('Format', [''])[0].lower() == 'text/html' files, total, start = self.get_files(handler, query, self.video_file_filter, force_alpha) videos = [] local_base_path = self.get_local_base_path(handler, query) for f in files: video = VideoDetails() mtime = f.mdate try: ltime = time.localtime(mtime) except: logger.warning('Bad file time on ' + unicode(f.name, 'utf-8')) mtime = int(time.time()) ltime = time.localtime(mtime) video['captureDate'] = hex(mtime) video['textDate'] = time.strftime('%b %d, %Y', ltime) video['name'] = os.path.basename(f.name) video['path'] = f.name video['part_path'] = f.name.replace(local_base_path, '', 1) if not video['part_path'].startswith(os.path.sep): video['part_path'] = os.path.sep + video['part_path'] video['title'] = os.path.basename(f.name) video['is_dir'] = f.isdir if video['is_dir']: video['small_path'] = subcname + '/' + video['name'] video['total_items'] = self.__total_items(f.name) else: if precache or len( files) == 1 or f.name in transcode.info_cache: video['valid'] = transcode.supported_format(f.name) if video['valid']: video.update(self.metadata_full(f.name, tsn)) if len(files) == 1: video['captureDate'] = hex(isogm(video['time'])) else: video['valid'] = True video.update(metadata.basic(f.name)) if config.hasTStivo(tsn): video['mime'] = 'video/x-tivo-mpeg-ts' else: video['mime'] = 'video/x-tivo-mpeg' video['textSize'] = ('%.3f GB' % (float(f.size) / (1024**3))) videos.append(video) if use_html: t = Template(HTML_CONTAINER_TEMPLATE, filter=EncodeUnicode) else: t = Template(XML_CONTAINER_TEMPLATE, filter=EncodeUnicode) t.container = handler.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 = config.tivos t.tivo_names = config.tivo_names if use_html: handler.send_html(str(t)) else: handler.send_xml(str(t))