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 force_alpha = container.getboolean('force_alpha') 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 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 self.use_ts(tsn, f.name): video['mime'] = 'video/x-tivo-mpeg-ts' else: video['mime'] = 'video/x-tivo-mpeg' video['textSize'] = metadata.human_size(f.size) 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): def getint(thing): try: result = int(thing) except: result = 0 return result global basic_meta shows_per_page = 50 # Change this to alter the number of shows returned folder = '' FirstAnchor = '' has_tivodecode = bool(config.get_bin('tivodecode')) useragent = handler.headers.getheader('User-Agent', '') if 'TiVo' in query: tivoIP = query['TiVo'][0] tsn = config.tivos_by_ip(tivoIP) 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, 'TiVoContainer/Details/TotalItems') ItemStart = tag_data(xmldoc, 'TiVoContainer/ItemStart') ItemCount = tag_data(xmldoc, 'TiVoContainer/ItemCount') title = tag_data(xmldoc, 'TiVoContainer/Details/Title') if items: FirstAnchor = tag_data(items[0], 'Links/Content/Url') data = [] for item in items: entry = {} entry['ContentType'] = tag_data(item, 'Details/ContentType') for tag in ('CopyProtected', 'UniqueId'): value = tag_data(item, 'Details/' + tag) if value: entry[tag] = value if entry['ContentType'] == 'x-tivo-container/folder': entry['Title'] = tag_data(item, 'Details/Title') entry['TotalItems'] = tag_data(item, 'Details/TotalItems') lc = tag_data(item, 'Details/LastCaptureDate') if not lc: lc = tag_data(item, 'Details/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 rawsize = entry['SourceSize'] entry['SourceSize'] = metadata.human_size(rawsize) dur = getint(entry['Duration']) / 1000 entry['Duration'] = ( '%d:%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 force_alpha = container.getboolean('force_alpha') ar = container.get('allow_recurse', 'auto').lower() if ar == 'auto': allow_recurse = not tsn or tsn[0] < '7' else: allow_recurse = ar in ('1', 'yes', 'true', 'on') files, total, start = self.get_files(handler, query, self.video_file_filter, force_alpha, allow_recurse) 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 = time.time() ltime = time.localtime(mtime) video['captureDate'] = hex(int(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 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, mtime=mtime)) if len(files) == 1: video['captureDate'] = hex(isogm(video['time'])) else: video['valid'] = True video.update(metadata.basic(f.name, mtime)) if self.use_ts(tsn, f.name): video['mime'] = 'video/x-tivo-mpeg-ts' else: video['mime'] = 'video/x-tivo-mpeg' video['textSize'] = metadata.human_size(f.size) videos.append(video) 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 handler.send_xml(str(t))
def NPL(handler, query): """ ToGo.NPL returns an html page displaying the now playing list (NPL) from a particular TiVo device. The query may specify: - TiVo: the IPv4 address of the TiVo whose NPL is to be retrieved - ItemCount: the number of shows/folders to put on the page (default: 50, max: 50) - AnchorItem: the url identifying the 1st item in the retrieved list (default 1st item in folder) - AnchorOffset: the offset from the AnchorItem to start the retrieval from (default 0) - SortOrder: - Recurse: """ def getint(thing): try: result = int(thing) except: # pylint: disable=bare-except result = 0 return result shows_per_page = 50 # Change this to alter the number of shows returned (max is 50) if 'ItemCount' in query: shows_per_page = int(query['ItemCount'][0]) if shows_per_page > 50: shows_per_page = 50 folder = '' FirstAnchor = '' has_tivodecode = bool(config.get_bin('tivodecode')) has_tivolibre = bool(config.get_bin('tivolibre')) if 'TiVo' in query: tivoIP = query['TiVo'][0] try: tsn = config.tivos_by_ip(tivoIP) attrs = config.tivos[tsn] tivo_name = attrs.get('name', tivoIP) tivo_mak = config.get_tsn('tivo_mak', tsn) except config.Error as e: logger.error('NPL: %s', e) t = Template(ERROR_TEMPLATE) t.e = e t.additional_info = 'Your browser may have cached an old page' handler.send_html(str(t)) return protocol = attrs.get('protocol', 'https') ip_port = '%s:%d' % (tivoIP, attrs.get('port', 443)) path = attrs.get('path', DEFPATH) baseurl = '%s://%s%s' % (protocol, ip_port, path) theurl = baseurl if 'Folder' in query: folder = query['Folder'][0] theurl = urljoin(theurl, folder) theurl += '&ItemCount=%d' % shows_per_page if 'AnchorItem' in query: theurl += '&AnchorItem=' + quote(query['AnchorItem'][0]) if 'AnchorOffset' in query: theurl += '&AnchorOffset=' + query['AnchorOffset'][0] if 'SortOrder' in query: theurl += '&SortOrder=' + query['SortOrder'][0] if 'Recurse' in query: theurl += '&Recurse=' + query['Recurse'][0] if (theurl not in tivo_cache or (time.time() - tivo_cache[theurl]['thepage_time']) >= 60): # if page is not cached or old then retrieve it auth_handler.add_password('TiVo DVR', ip_port, 'tivo', tivo_mak) logger.debug('NPL: (1) add password for TiVo DVR netloc: %s', ip_port) try: logger.debug("NPL.theurl: %s", theurl) with tivo_open(theurl) as page: tivo_cache[theurl] = {'thepage': minidom.parse(page), 'thepage_time': time.time()} except IOError as e: handler.redir(UNABLE % (tivoIP, html.escape(str(e))), 10) return xmldoc = tivo_cache[theurl]['thepage'] items = xmldoc.getElementsByTagName('Item') TotalItems = tag_data(xmldoc, 'TiVoContainer/Details/TotalItems') ItemStart = tag_data(xmldoc, 'TiVoContainer/ItemStart') ItemCount = tag_data(xmldoc, 'TiVoContainer/ItemCount') title = tag_data(xmldoc, 'TiVoContainer/Details/Title') if items: FirstAnchor = tag_data(items[0], 'Links/Content/Url') data = [] for item in items: entry = {} for tag in ('CopyProtected', 'ContentType'): value = tag_data(item, 'Details/' + tag) if value: entry[tag] = value if entry['ContentType'].startswith('x-tivo-container'): entry['Url'] = tag_data(item, 'Links/Content/Url') entry['Title'] = tag_data(item, 'Details/Title') entry['TotalItems'] = tag_data(item, 'Details/TotalItems') lc = tag_data(item, 'Details/LastCaptureDate') if not lc: lc = tag_data(item, 'Details/LastChangeDate') entry['LastChangeDate'] = time.strftime('%b %d, %Y', time.localtime(int(lc, 16))) else: keys = {'Icon': 'Links/CustomIcon/Url', 'Url': 'Links/Content/Url', 'Details': 'Links/TiVoVideoDetails/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 if 'SourceSize' in entry: rawsize = entry['SourceSize'] entry['SourceSize'] = metadata.human_size(rawsize) if 'Duration' in entry: dur = getint(entry['Duration']) // 1000 entry['Duration'] = ('%d:%02d:%02d' % (dur // 3600, (dur % 3600) // 60, dur % 60)) if 'CaptureDate' in entry: entry['CaptureDate'] = time.strftime('%b %d, %Y', time.localtime(int(entry['CaptureDate'], 16))) dnld_url = entry['Url'] # the tivo download url seems to always be absolute, so is this necessary? # I'm commenting it out -mjl 7/23/2017 #dnld_url = urljoin(baseurl, dnld_url) if not dnld_url in showinfo: showinfo[dnld_url] = ShowInfo() showinfo[dnld_url].from_tivo_container_item(item) entry.update(showinfo[dnld_url].get_old_basicmeta()) data.append(entry) else: data = [] tivoIP = '' TotalItems = 0 ItemStart = 0 ItemCount = 0 title = '' tsn = '' tivo_name = '' t = Template(NPL_TEMPLATE) t.quote = quote t.folder = folder t.urlstatus = ToGo.get_urlstatus(tivoIP) t.has_tivodecode = has_tivodecode t.has_tivolibre = has_tivolibre t.togo_mpegts = config.is_ts_capable(tsn) t.tname = tivo_name t.tivoIP = tivoIP t.container = handler.cname t.data = data t.len = len t.TotalItems = getint(TotalItems) t.ItemStart = getint(ItemStart) t.ItemCount = getint(ItemCount) t.FirstAnchor = quote(FirstAnchor) t.shows_per_page = shows_per_page t.title = title handler.send_html(str(t), refresh='300')
def NPL(self, handler, query): def getint(thing): try: result = int(thing) except: result = 0 return result global basic_meta global details_urls shows_per_page = 50 # Change this to alter the number of shows returned folder = '' FirstAnchor = '' has_tivodecode = bool(config.get_bin('tivodecode')) if 'TiVo' in query: tivoIP = query['TiVo'][0] tsn = config.tivos_by_ip(tivoIP) attrs = config.tivos[tsn] tivo_name = attrs.get('name', tivoIP) tivo_mak = config.get_tsn('tivo_mak', tsn) protocol = attrs.get('protocol', 'https') ip_port = '%s:%d' % (tivoIP, attrs.get('port', 443)) path = attrs.get('path', DEFPATH) baseurl = '%s://%s%s' % (protocol, ip_port, path) theurl = baseurl if 'Folder' in query: folder = query['Folder'][0] theurl = urlparse.urljoin(theurl, folder) theurl += '&ItemCount=%d' % shows_per_page 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', ip_port, 'tivo', tivo_mak) try: page = self.tivo_open(theurl) except IOError, e: handler.redir(UNABLE % (tivoIP, cgi.escape(str(e))), 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, 'TiVoContainer/Details/TotalItems') ItemStart = tag_data(xmldoc, 'TiVoContainer/ItemStart') ItemCount = tag_data(xmldoc, 'TiVoContainer/ItemCount') title = tag_data(xmldoc, 'TiVoContainer/Details/Title') if items: FirstAnchor = tag_data(items[0], 'Links/Content/Url') data = [] for item in items: entry = {} for tag in ('CopyProtected', 'ContentType'): value = tag_data(item, 'Details/' + tag) if value: entry[tag] = value if entry['ContentType'].startswith('x-tivo-container'): entry['Url'] = tag_data(item, 'Links/Content/Url') entry['Title'] = tag_data(item, 'Details/Title') entry['TotalItems'] = tag_data(item, 'Details/TotalItems') lc = tag_data(item, 'Details/LastCaptureDate') if not lc: lc = tag_data(item, 'Details/LastChangeDate') entry['LastChangeDate'] = time.strftime( '%b %d, %Y', time.localtime(int(lc, 16))) else: keys = { 'Icon': 'Links/CustomIcon/Url', 'Url': 'Links/Content/Url', 'Details': 'Links/TiVoVideoDetails/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 if 'SourceSize' in entry: rawsize = entry['SourceSize'] entry['SourceSize'] = metadata.human_size(rawsize) if 'Duration' in entry: dur = getint(entry['Duration']) / 1000 entry['Duration'] = ('%d:%02d:%02d' % (dur / 3600, (dur % 3600) / 60, dur % 60)) if 'CaptureDate' in entry: entry['CaptureDate'] = time.strftime( '%b %d, %Y', time.localtime(int(entry['CaptureDate'], 16))) url = urlparse.urljoin(baseurl, entry['Url']) entry['Url'] = 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 if 'Details' in entry: details_urls[url] = entry['Details'] 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 force_alpha = container.getboolean('force_alpha') ar = container.get('allow_recurse', 'auto').lower() if ar == 'auto': allow_recurse = not tsn or tsn[0] < '7' else: allow_recurse = ar in ('1', 'yes', 'true', 'on') files, total, start = self.get_files(handler, query, self.video_file_filter, force_alpha, allow_recurse) 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 = time.time() ltime = time.localtime(mtime) video['captureDate'] = hex(int(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 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, mtime=mtime)) if len(files) == 1: video['captureDate'] = hex(isogm(video['time'])) else: video['valid'] = True video.update(metadata.basic(f.name, mtime)) if self.use_ts(tsn, f.name): video['mime'] = 'video/x-tivo-mpeg-ts' else: video['mime'] = 'video/x-tivo-mpeg' video['textSize'] = metadata.human_size(f.size) videos.append(video) 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 handler.send_xml(str(t))
def NPL(self, handler, query): def getint(thing): try: result = int(thing) except: result = 0 return result global basic_meta global details_urls shows_per_page = 50 # Change this to alter the number of shows returned folder = '' FirstAnchor = '' has_tivodecode = bool(config.get_bin('tivodecode')) if 'TiVo' in query: tivoIP = query['TiVo'][0] tsn = config.tivos_by_ip(tivoIP) attrs = config.tivos[tsn] tivo_name = attrs.get('name', tivoIP) tivo_mak = config.get_tsn('tivo_mak', tsn) protocol = attrs.get('protocol', 'https') ip_port = '%s:%d' % (tivoIP, attrs.get('port', 443)) path = attrs.get('path', DEFPATH) baseurl = '%s://%s%s' % (protocol, ip_port, path) theurl = baseurl if 'Folder' in query: folder = query['Folder'][0] theurl = urlparse.urljoin(theurl, folder) theurl += '&ItemCount=%d' % shows_per_page 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', ip_port, 'tivo', tivo_mak) try: page = self.tivo_open(theurl) except IOError, e: handler.redir(UNABLE % (tivoIP, cgi.escape(str(e))), 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, 'TiVoContainer/Details/TotalItems') ItemStart = tag_data(xmldoc, 'TiVoContainer/ItemStart') ItemCount = tag_data(xmldoc, 'TiVoContainer/ItemCount') title = tag_data(xmldoc, 'TiVoContainer/Details/Title') if items: FirstAnchor = tag_data(items[0], 'Links/Content/Url') data = [] for item in items: entry = {} for tag in ('CopyProtected', 'ContentType'): value = tag_data(item, 'Details/' + tag) if value: entry[tag] = value if entry['ContentType'].startswith('x-tivo-container'): entry['Url'] = tag_data(item, 'Links/Content/Url') entry['Title'] = tag_data(item, 'Details/Title') entry['TotalItems'] = tag_data(item, 'Details/TotalItems') lc = tag_data(item, 'Details/LastCaptureDate') if not lc: lc = tag_data(item, 'Details/LastChangeDate') entry['LastChangeDate'] = time.strftime('%b %d, %Y', time.localtime(int(lc, 16))) else: keys = {'Icon': 'Links/CustomIcon/Url', 'Url': 'Links/Content/Url', 'Details': 'Links/TiVoVideoDetails/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 if 'SourceSize' in entry: rawsize = entry['SourceSize'] entry['SourceSize'] = metadata.human_size(rawsize) if 'Duration' in entry: dur = getint(entry['Duration']) / 1000 entry['Duration'] = ( '%d:%02d:%02d' % (dur / 3600, (dur % 3600) / 60, dur % 60) ) if 'CaptureDate' in entry: entry['CaptureDate'] = time.strftime('%b %d, %Y', time.localtime(int(entry['CaptureDate'], 16))) url = urlparse.urljoin(baseurl, entry['Url']) entry['Url'] = 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 if 'Details' in entry: details_urls[url] = entry['Details'] 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 force_alpha = container.getboolean('force_alpha') ar = container.get('allow_recurse', 'auto').lower() if ar == 'auto': allow_recurse = not tsn or tsn[0] < '7' else: allow_recurse = ar in ('1', 'yes', 'true', 'on') use_html = query.get('Format', [''])[0].lower() == 'text/html' files, total, start = self.get_files(handler, query, self.video_file_filter, force_alpha, allow_recurse) videos = [] local_base_path = self.get_local_base_path(handler, query) resort = False 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 = time.time() ltime = time.localtime(mtime) video['captureDate'] = hex(int(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 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, mtime=mtime)) if len(files) == 1: video['captureDate'] = hex(isogm(video['time'])) else: video['valid'] = True video.update(metadata.basic(f.name, mtime)) if 'time' in video and video['time'] != '': if video['time'].lower() == 'oad': video['time'] = video['originalAirDate'] resort = True try: video['captureDate'] = hex(isogm(video['time'])) video['textDate'] = time.strftime('%b %d, %Y', time.localtime(isogm(video['time']))) resort = True except: logger.warning('Bad time format: "' + video['time'] + '", using current time') if self.use_ts(tsn, f.name): video['mime'] = 'video/x-tivo-mpeg-ts' else: video['mime'] = 'video/x-tivo-mpeg' video['textSize'] = metadata.human_size(f.size) videos.append(video) if use_html: t = Template(HTML_CONTAINER_TEMPLATE, filter=EncodeUnicode) else: t = Template(XML_CONTAINER_TEMPLATE, filter=EncodeUnicode) sortby = query.get('SortOrder', ['Normal'])[0].lower() t.sortby = sortby if use_html and resort: if sortby == 'capturedate': logger.info('re-sorting by captureDate, reverse=True') videos.sort(key=itemgetter('captureDate'), reverse=True) elif sortby == '!capturedate': logger.info('re-sorting by captureDate, reverse=False') videos.sort(key=itemgetter('captureDate'), reverse=False) 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 if use_html: handler.send_html(str(t)) else: handler.send_xml(str(t))