nodes: 0, module; 1, function_definition; 2, function_name:_music_lib_search; 3, parameters; 4, block; 5, identifier:self; 6, identifier:search; 7, identifier:start; 8, identifier:max_items; 9, expression_statement; 10, expression_statement; 11, comment:# Get result information; 12, expression_statement; 13, for_statement; 14, return_statement; 15, comment:"""Perform a music library search and extract search numbers.
  
          You can get an overview of all the relevant search prefixes (like
          'A:') and their meaning with the request:
  
          .. code ::
  
           response = device.contentDirectory.Browse([
               ('ObjectID', '0'),
               ('BrowseFlag', 'BrowseDirectChildren'),
               ('Filter', '*'),
               ('StartingIndex', 0),
               ('RequestedCount', 100),
               ('SortCriteria', '')
           ])
  
          Args:
              search (str): The ID to search.
              start (int): The index of the forst item to return.
              max_items (int): The maximum number of items to return.
  
          Returns:
              tuple: (response, metadata) where response is the returned metadata
                  and metadata is a dict with the 'number_returned',
                  'total_matches' and 'update_id' integers
          """; 16, assignment; 17, assignment; 18, identifier:tag; 19, list; 20, block; 21, expression_list; 22, identifier:response; 23, call; 24, identifier:metadata; 25, dictionary; 26, string; 27, string; 28, string; 29, expression_statement; 30, identifier:response; 31, identifier:metadata; 32, attribute; 33, argument_list; 34, string_content:NumberReturned; 35, string_content:TotalMatches; 36, string_content:UpdateID; 37, assignment; 38, attribute; 39, identifier:Browse; 40, list; 41, subscript; 42, call; 43, identifier:self; 44, identifier:contentDirectory; 45, tuple; 46, tuple; 47, tuple; 48, tuple; 49, tuple; 50, tuple; 51, identifier:metadata; 52, call; 53, identifier:int; 54, argument_list; 55, string; 56, identifier:search; 57, string; 58, string; 59, string; 60, string; 61, string; 62, identifier:start; 63, string; 64, identifier:max_items; 65, string; 66, string; 67, identifier:camel_to_underscore; 68, argument_list; 69, subscript; 70, string_content:ObjectID; 71, string_content:BrowseFlag; 72, string_content:BrowseDirectChildren; 73, string_content:Filter; 74, string_content:*; 75, string_content:StartingIndex; 76, string_content:RequestedCount; 77, string_content:SortCriteria; 78, identifier:tag; 79, identifier:response; 80, identifier:tag
code: def _music_lib_search(self, search, start, max_items):
          """Perform a music library search and extract search numbers.
  
          You can get an overview of all the relevant search prefixes (like
          'A:') and their meaning with the request:
  
          .. code ::
  
           response = device.contentDirectory.Browse([
               ('ObjectID', '0'),
               ('BrowseFlag', 'BrowseDirectChildren'),
               ('Filter', '*'),
               ('StartingIndex', 0),
               ('RequestedCount', 100),
               ('SortCriteria', '')
           ])
  
          Args:
              search (str): The ID to search.
              start (int): The index of the forst item to return.
              max_items (int): The maximum number of items to return.
  
          Returns:
              tuple: (response, metadata) where response is the returned metadata
                  and metadata is a dict with the 'number_returned',
                  'total_matches' and 'update_id' integers
          """
          response = self.contentDirectory.Browse([
              ('ObjectID', search),
              ('BrowseFlag', 'BrowseDirectChildren'),
              ('Filter', '*'),
              ('StartingIndex', start),
              ('RequestedCount', max_items),
              ('SortCriteria', '')
          ])
  
          # Get result information
          metadata = {}
          for tag in ['NumberReturned', 'TotalMatches', 'UpdateID']:
              metadata[camel_to_underscore(tag)] = int(response[tag])
          return response, metadata