Retrieve the primary text for an item from the server

        :type item_url: String or Item
        :param item_url: URL of the item, or an Item object
        :type force_download: Boolean
        :param force_download: True to download from the server
            regardless of the cache's contents

        :rtype: String
        :returns: the item's primary text if it has one, otherwise None

        :raises: APIError if the request was not successful

def get_primary_text(self, item_url, force_download=False):
        """ Retrieve the primary text for an item from the server

        :type item_url: String or Item
        :param item_url: URL of the item, or an Item object
        :type force_download: Boolean
        :param force_download: True to download from the server
            regardless of the cache's contents

        :rtype: String
        :returns: the item's primary text if it has one, otherwise None

        :raises: APIError if the request was not successful


        """
        item_url = str(item_url)
        metadata = self.get_item(item_url).metadata()

        try:
            primary_text_url = metadata['alveo:primary_text_url']
        except KeyError:
            return None

        if primary_text_url == 'No primary text found':
            return None

        if (self.use_cache and
                not force_download and
                self.cache.has_primary_text(item_url)):
            primary_text = self.cache.get_primary_text(item_url)
        else:
            primary_text = self.api_request(primary_text_url, raw=True)
            if self.update_cache:
                self.cache.add_primary_text(item_url, primary_text)

        return primary_text