docs: def get_rooms(self, lid, start=None, end=None):
          """Returns a list of rooms and their availabilities, grouped by category.
  
          :param lid: The ID of the location to retrieve rooms for.
          :type lid: int
          :param start: The start range for the availabilities to retrieve, in YYYY-MM-DD format.
          :type start: str
          :param end: The end range for the availabilities to retrieve, in YYYY-MM-DD format.
          :type end: str
          """
          range_str = "availability"
          if start:
              start_datetime = datetime.datetime.combine(datetime.datetime.strptime(start, "%Y-%m-%d").date(), datetime.datetime.min.time())
              range_str += "=" + start
              if end and not start == end:
                  range_str += "," + end
          else:
              start_datetime = None
  
          resp = self._request("GET", "/1.1/space/categories/{}".format(lid)).json()
          if "error" in resp:
              raise APIError(resp["error"])
          output = {"id": lid, "categories": []}
  
          # if there aren't any rooms associated with this location, return
          if len(resp) < 1:
              return output
  
          if "error" in resp[0]:
              raise APIError(resp[0]["error"])
  
          if "categories" not in resp[0]:
              return output
  
          categories = resp[0]["categories"]
          id_to_category = {i["cid"]: i["name"] for i in categories}
          categories = ",".join([str(x["cid"]) for x in categories])
          resp = self._request("GET", "/1.1/space/category/{}".format(categories))
          for category in resp.json():
              cat_out = {"cid": category["cid"], "name": id_to_category[category["cid"]], "rooms": []}
  
              # ignore equipment categories
              if cat_out["name"].endswith("Equipment"):
                  continue
  
              items = category["items"]
              items = ",".join([str(x) for x in items])
              resp = self._request("GET", "/1.1/space/item/{}?{}".format(items, range_str))
              for room in resp.json():
                  if room["id"] in ROOM_BLACKLIST:
                      continue
                  # prepend protocol to urls
                  if "image" in room and room["image"]:
                      if not room["image"].startswith("http"):
                          room["image"] = "https:" + room["image"]
                  # convert html descriptions to text
                  if "description" in room:
                      description = room["description"].replace(u'\xa0', u' ')
                      room["description"] = BeautifulSoup(description, "html.parser").text.strip()
                  # remove extra fields
                  if "formid" in room:
                      del room["formid"]
                  # enforce date filter
                  # API returns dates outside of the range, fix this manually
                  if start_datetime:
                      out_times = []
                      for time in room["availability"]:
                          parsed_start = datetime.datetime.strptime(time["from"][:-6], "%Y-%m-%dT%H:%M:%S")
                          if parsed_start >= start_datetime:
                              out_times.append(time)
                      room["availability"] = out_times
                  cat_out["rooms"].append(room)
              if cat_out["rooms"]:
                  output["categories"].append(cat_out)
          return output