def url_for(self, endpoint, **items): '''Returns a valid XBMC plugin URL for the given endpoint name. endpoint can be the literal name of a function, or it can correspond to the name keyword arguments passed to the route decorator. Raises AmbiguousUrlException if there is more than one possible view for the given endpoint name. ''' try: rule = self._view_functions[endpoint] except KeyError: try: rule = (rule for rule in self._view_functions.values() if rule.view_func == endpoint).next() except StopIteration: raise NotFoundException( '%s doesn\'t match any known patterns.' % endpoint) # rule can be None since values of None are allowed in the # _view_functions dict. This signifies more than one view function is # tied to the same name. if not rule: # TODO: Make this a regular exception raise AmbiguousUrlException pathqs = rule.make_path_qs(items) return 'plugin://%s%s' % (self._addon_id, pathqs)
def _dispatch(self, path): for rule in self._routes: try: view_func, items = rule.match(path) except NotFoundException: continue log.info('Request for "%s" matches rule for function "%s"', path, view_func.__name__) listitems = view_func(**items) # Only call self.finish() for UI container listing calls to plugin # (handle will be >= 0). Do not call self.finish() when called via # RunPlugin() (handle will be -1). if not self._end_of_directory and self.handle >= 0: if listitems is None: self.finish(succeeded=False) else: listitems = self.finish(listitems) return listitems raise NotFoundException('No matching view found for %s' % path)