From a96f94b67688478fa8e24833d871797a2b8dbb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mal=C3=BD?= <michal.maly@ibt.cas.cz> Date: Thu, 11 Aug 2022 15:09:58 +0200 Subject: [PATCH] Allow download of Gzipped files --- CHANGELOG.md | 1 + src/mol-plugin-state/actions/file.ts | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c47d5cdfb..36040fd1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Note that since we don't clearly distinguish between a public and private interf - Improve naming of some internal types in Confal pyramids extension coordinate - Add example mmCIF file with categories necessary to display Confal pyramids - Change the lookup logic of NtC steps from residues +- Add support for download of gzipped files ## [v3.13.0] - 2022-07-24 diff --git a/src/mol-plugin-state/actions/file.ts b/src/mol-plugin-state/actions/file.ts index 0f92b915b..ee81b0793 100644 --- a/src/mol-plugin-state/actions/file.ts +++ b/src/mol-plugin-state/actions/file.ts @@ -83,7 +83,7 @@ export const DownloadFile = StateAction.build({ display: { name: 'Download File', description: 'Load one or more file from an URL' }, from: PluginStateObject.Root, params: (a, ctx: PluginContext) => { - const options = [...ctx.dataFormats.options, ['zip', 'Zip'] as const]; + const options = [...ctx.dataFormats.options, ['zip', 'Zip'] as const, ['gzip', 'Gzip'] as const]; return { url: PD.Url(''), format: PD.Select(options[0][0], options), @@ -96,17 +96,23 @@ export const DownloadFile = StateAction.build({ await state.transaction(async () => { try { - if (params.format === 'zip') { + if (params.format === 'zip' || params.format === 'gzip') { // TODO: add ReadZipFile transformer so this can be saved as a simple state snaphot, // would need support for extracting individual files from zip const data = await plugin.builders.data.download({ url: params.url, isBinary: true }); - const zippedFiles = await unzip(taskCtx, (data.obj?.data as Uint8Array).buffer); - for (const [fn, filedata] of Object.entries(zippedFiles)) { - if (!(filedata instanceof Uint8Array) || filedata.length === 0) continue; + if (params.format === 'zip') { + const zippedFiles = await unzip(taskCtx, (data.obj?.data as Uint8Array).buffer); + for (const [fn, filedata] of Object.entries(zippedFiles)) { + if (!(filedata instanceof Uint8Array) || filedata.length === 0) continue; - const asset = Asset.File(new File([filedata], fn)); + const asset = Asset.File(new File([filedata], fn)); - await processFile(asset, plugin, 'auto', params.visuals); + await processFile(asset, plugin, 'auto', params.visuals); + } + } else { + const url = Asset.getUrl(params.url); + const info = getFileInfo(url); + await processFile(Asset.File(new File([data.obj?.data as Uint8Array], info.name)), plugin, 'auto', params.visuals); } } else { const provider = plugin.dataFormats.get(params.format); -- GitLab