@@ -184,6 +184,11 @@ class AbstractContext(object):
184184 ))
185185 _NON_EMPTY_STRING_PARAMS = set ()
186186
187+ _PATH_PARAMS = {
188+ 'channel' : CHANNEL_ID ,
189+ 'playlist' : PLAYLIST_ID ,
190+ }
191+
187192 def __init__ (self , path = '/' , params = None , plugin_id = '' ):
188193 self ._access_manager = None
189194 self ._uuid = None
@@ -205,7 +210,7 @@ def __init__(self, path='/', params=None, plugin_id=''):
205210 self ._version = 'UNKNOWN'
206211
207212 self ._param_string = ''
208- self ._params = params or {}
213+ self ._params = {}
209214 if params :
210215 self .parse_params (params )
211216
@@ -511,9 +516,8 @@ def set_path(self, *path, **kwargs):
511516 parts = kwargs .get ('parts' )
512517 path = unquote (path [0 ])
513518 if parts is None :
514- path = path .split ('/' )
515519 path , parts = self .create_path (
516- * path ,
520+ * path . split ( '/' ) ,
517521 parts = True ,
518522 parser = kwargs .get ('parser' )
519523 )
@@ -525,6 +529,8 @@ def set_path(self, *path, **kwargs):
525529 if kwargs .get ('update_uri' , True ):
526530 self .update_uri ()
527531
532+ return path
533+
528534 def get_original_params (self ):
529535 return self ._param_string
530536
@@ -537,19 +543,42 @@ def get_param(self, name, default=None):
537543 def pop_param (self , name , default = None ):
538544 return self ._params .pop (name , default )
539545
540- def parse_uri (self , uri , parse_params = True , update = False ):
546+ @classmethod
547+ def parse_path (cls , path ):
548+ params = {}
549+ path_params = cls ._PATH_PARAMS
550+ path = path .rstrip ('/' )
551+ while path :
552+ param , _ , next_part = path .partition ('/' )
553+ if not next_part :
554+ break
555+
556+ if param in path_params :
557+ value = next_part .partition ('/' )[0 ]
558+ if value :
559+ params [path_params [param ]] = value
560+
561+ path = next_part
562+
563+ return params
564+
565+ def parse_uri (self , uri , parse_params = True , parse_path = True , update = False ):
541566 uri = urlsplit (uri )
542567 path = uri .path
543- if parse_params :
544- params = self .parse_params (
545- dict (parse_qsl (uri .query , keep_blank_values = True )),
546- update = False ,
547- )
548- if update :
549- self ._params = params
550- self .set_path (path )
551- else :
552- params = uri .query
568+ if not parse_params :
569+ return path , uri .query
570+
571+ params = dict (parse_qsl (uri .query , keep_blank_values = True ))
572+
573+ if parse_path :
574+ params .update (self .parse_path (path ))
575+
576+ params = self .parse_params (params , update = False )
577+
578+ if update :
579+ self ._params = params
580+ self .set_path (path )
581+
553582 return path , params
554583
555584 def parse_params (self , params , update = True , parser = None ):
0 commit comments