searches the videohub given a query and applies given filters and other bits

        :see: https://github.com/theonion/videohub/blob/master/docs/search/post.md
        :see: https://github.com/theonion/videohub/blob/master/docs/search/get.md

        :param query: query terms to search by
        :type query: str
        :example query: "brooklyn hipsters"  # although, this is a little redundant...

        :param filters: video field value restrictions
        :type filters: dict
        :default filters: None
        :example filters: {"channel": "onion"} or {"series": "Today NOW"}

        :param status: limit the results to videos that are published, scheduled, draft
        :type status: str
        :default status: None
        :example status: "published" or "draft" or "scheduled"

        :param sort: video field related sorting
        :type sort: dict
        :default sort: None
        :example sort: {"title": "desc"} or {"description": "asc"}

        :param size: the page size (number of results)
        :type size: int
        :default size: None
        :example size": {"size": 20}

        :param page: the page number of the results
        :type page: int
        :default page: None
        :example page: {"page": 2}  # note, you should use `size` in conjunction with `page`

        :return: a dictionary of results and meta information
        :rtype: dict

def search_videohub(cls, query, filters=None, status=None, sort=None, size=None, page=None):
        """searches the videohub given a query and applies given filters and other bits

        :see: https://github.com/theonion/videohub/blob/master/docs/search/post.md
        :see: https://github.com/theonion/videohub/blob/master/docs/search/get.md

        :param query: query terms to search by
        :type query: str
        :example query: "brooklyn hipsters"  # although, this is a little redundant...

        :param filters: video field value restrictions
        :type filters: dict
        :default filters: None
        :example filters: {"channel": "onion"} or {"series": "Today NOW"}

        :param status: limit the results to videos that are published, scheduled, draft
        :type status: str
        :default status: None
        :example status: "published" or "draft" or "scheduled"

        :param sort: video field related sorting
        :type sort: dict
        :default sort: None
        :example sort: {"title": "desc"} or {"description": "asc"}

        :param size: the page size (number of results)
        :type size: int
        :default size: None
        :example size": {"size": 20}

        :param page: the page number of the results
        :type page: int
        :default page: None
        :example page: {"page": 2}  # note, you should use `size` in conjunction with `page`

        :return: a dictionary of results and meta information
        :rtype: dict
        """
        # construct url
        url = getattr(settings, "VIDEOHUB_API_SEARCH_URL", cls.DEFAULT_VIDEOHUB_API_SEARCH_URL)
        # construct auth headers
        headers = {
            "Content-Type": "application/json",
            "Authorization": settings.VIDEOHUB_API_TOKEN,
        }
        # construct payload
        payload = {
            "query": query,
        }
        if filters:
            assert isinstance(filters, dict)
            payload["filters"] = filters
        if status:
            assert isinstance(status, six.string_types)
            payload.setdefault("filters", {})
            payload["filters"]["status"] = status
        if sort:
            assert isinstance(sort, dict)
            payload["sort"] = sort
        if size:
            assert isinstance(size, (six.string_types, int))
            payload["size"] = size
        if page:
            assert isinstance(page, (six.string_types, int))
            payload["page"] = page
        # send request
        res = requests.post(url, data=json.dumps(payload), headers=headers)
        # raise if not 200
        if res.status_code != 200:
            res.raise_for_status()
        # parse and return response
        return json.loads(res.content)