Separated getting thumbnail info from downloading the thumbnail

Also added a TODO for future reference.
This commit is contained in:
Sybren A. Stüvel 2016-03-15 14:23:11 +01:00
parent fc0fe9f651
commit e60853a211

View File

@ -131,8 +131,13 @@ async def get_nodes(project_uuid: str = None, parent_node_uuid: str = None,
async def download_to_file(url, filename, chunk_size=10 * 1024, *, future: asyncio.Future = None): async def download_to_file(url, filename, chunk_size=10 * 1024, *, future: asyncio.Future = None):
"""Downloads a file via HTTP(S) directly to the filesystem.""" """Downloads a file via HTTP(S) directly to the filesystem."""
# TODO: use the file's ETag header to check whether we need to redownload the file at all.
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
# Separated doing the GET and downloading the body of the GET, so that we can cancel
# the download in between.
def perform_get_request(): def perform_get_request():
return requests.get(url, stream=True, verify=True) return requests.get(url, stream=True, verify=True)
@ -164,22 +169,23 @@ async def download_to_file(url, filename, chunk_size=10 * 1024, *, future: async
log.debug('Done downloading response of GET %s', url) log.debug('Done downloading response of GET %s', url)
async def stream_thumb_to_file(file: pillarsdk.File, directory: str, desired_size: str, *, async def fetch_thumbnail_info(file: pillarsdk.File, directory: str, desired_size: str, *,
future: asyncio.Future = None): future: asyncio.Future = None):
"""Streams a thumbnail to a file. """Fetches thumbnail information from Pillar.
@param file: the pillar File object that represents the image whose thumbnail to download. @param file: the pillar File object that represents the image whose thumbnail to download.
@param directory: the directory to save the file to. @param directory: the directory to save the file to.
@param desired_size: thumbnail size @param desired_size: thumbnail size
@return: the absolute path of the downloaded file, or None if the task was cancelled before @return: (url, path), where 'url' is the URL to download the thumbnail from, and 'path' is the absolute path of the
downloading finished. where the thumbnail should be downloaded to. Returns None, None if the task was cancelled before downloading
finished.
""" """
api = pillar_api() api = pillar_api()
if is_cancelled(future): if is_cancelled(future):
log.debug('stream_thumb_to_file(): cancelled before fetching thumbnail URL from Pillar') log.debug('stream_thumb_to_file(): cancelled before fetching thumbnail URL from Pillar')
return None return None, None
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
thumb_link = await loop.run_in_executor(None, functools.partial( thumb_link = await loop.run_in_executor(None, functools.partial(
@ -191,15 +197,13 @@ async def stream_thumb_to_file(file: pillarsdk.File, directory: str, desired_siz
if is_cancelled(future): if is_cancelled(future):
log.debug('stream_thumb_to_file(): cancelled before downloading file') log.debug('stream_thumb_to_file(): cancelled before downloading file')
return None return None, None
root, ext = os.path.splitext(file['file_path']) root, ext = os.path.splitext(file['file_path'])
thumb_fname = "{0}-{1}.jpg".format(root, desired_size) thumb_fname = "{0}-{1}.jpg".format(root, desired_size)
thumb_path = os.path.abspath(os.path.join(directory, thumb_fname)) thumb_path = os.path.abspath(os.path.join(directory, thumb_fname))
await download_to_file(thumb_link, thumb_path, future=future) return thumb_link, thumb_path
return thumb_path
async def fetch_texture_thumbs(parent_node_uuid: str, desired_size: str, async def fetch_texture_thumbs(parent_node_uuid: str, desired_size: str,
@ -255,16 +259,16 @@ async def fetch_texture_thumbs(parent_node_uuid: str, desired_size: str,
file_desc['_id']) file_desc['_id'])
return return
# Save the thumbnail # Get the thumbnail information from Pillar
thumb_path = await stream_thumb_to_file(file_desc, thumbnail_directory, desired_size, thumb_url, thumb_path = await fetch_thumbnail_info(file_desc, thumbnail_directory, desired_size,
future=future) future=future)
if thumb_path is None: if thumb_path is None:
# The task got cancelled, we should abort too. # The task got cancelled, we should abort too.
log.debug('fetch_texture_thumbs cancelled while downloading file %r', log.debug('fetch_texture_thumbs cancelled while downloading file %r',
file_desc['_id']) file_desc['_id'])
return return
# print('Texture node {} has file {}'.format(texture_node['_id'], thumb_path)) await download_to_file(thumb_url, thumb_path, future=future)
loop.call_soon_threadsafe(functools.partial(thumbnail_loaded, loop.call_soon_threadsafe(functools.partial(thumbnail_loaded,
texture_node['_id'], texture_node['_id'],