From 5ea2ed67d7762b62908d6fcd1ad4971423780910 Mon Sep 17 00:00:00 2001 From: teidesu Date: Wed, 5 May 2021 19:59:08 +0300 Subject: [PATCH] fix(client): support for external media for uploadMedia in normalizeInputMedia --- .../methods/files/normalize-input-media.ts | 99 +++++++++---------- 1 file changed, 48 insertions(+), 51 deletions(-) diff --git a/packages/client/src/methods/files/normalize-input-media.ts b/packages/client/src/methods/files/normalize-input-media.ts index 463e4728..c38a7ec1 100644 --- a/packages/client/src/methods/files/normalize-input-media.ts +++ b/packages/client/src/methods/files/normalize-input-media.ts @@ -56,16 +56,56 @@ export async function _normalizeInputMedia( mime = uploaded.mime } + const uploadMediaIfNeeded = async (inputMedia: tl.TypeInputMedia, photo: boolean): Promise => { + if (!uploadMedia) return inputMedia + + const res = await this.call({ + _: 'messages.uploadMedia', + peer: { _: 'inputPeerSelf' }, + media: inputMedia + }) + + if (photo) { + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res, 'messageMediaPhoto') + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res.photo!, 'photo') + + return { + _: 'inputMediaPhoto', + id: { + _: 'inputPhoto', + id: res.photo.id, + accessHash: res.photo.accessHash, + fileReference: res.photo.fileReference + }, + ttlSeconds: media.ttlSeconds + } + } else { + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res, 'messageMediaDocument') + assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res.document!, 'document') + + return { + _: 'inputMediaDocument', + id: { + _: 'inputDocument', + id: res.document.id, + accessHash: res.document.accessHash, + fileReference: res.document.fileReference + }, + ttlSeconds: media.ttlSeconds + } + } + } + const input = media.file if (tdFileId.isFileIdLike(input)) { if (typeof input === 'string' && input.match(/^https?:\/\//)) { - return { + return uploadMediaIfNeeded({ _: media.type === 'photo' ? 'inputMediaPhotoExternal' : 'inputMediaDocumentExternal', url: input, - } + }, media.type === 'photo') } else if (typeof input === 'string' && input.match(/^file:/)) { await upload(input.substr(5)) } else { @@ -78,13 +118,13 @@ export async function _normalizeInputMedia( id: fileIdToInputPhoto(parsed), } } else if (parsed.location._ === 'web') { - return { + return uploadMediaIfNeeded({ _: parsed.type === tdFileId.FileType.Photo ? 'inputMediaPhotoExternal' : 'inputMediaDocumentExternal', url: parsed.location.url, - } + }, parsed.type === tdFileId.FileType.Photo) } else { return { _: 'inputMediaDocument', @@ -106,32 +146,11 @@ export async function _normalizeInputMedia( if (!inputFile) throw new Error('should not happen') if (media.type === 'photo') { - const ret: tl.RawInputMediaUploadedPhoto = { + return uploadMediaIfNeeded({ _: 'inputMediaUploadedPhoto', file: inputFile, ttlSeconds: media.ttlSeconds, - } - if (!uploadMedia) return ret - - const res = await this.call({ - _: 'messages.uploadMedia', - peer: { _: 'inputPeerSelf' }, - media: ret - }) - - assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res, 'messageMediaPhoto') - assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res.photo!, 'photo') - - return { - _: 'inputMediaPhoto', - id: { - _: 'inputPhoto', - id: res.photo.id, - accessHash: res.photo.accessHash, - fileReference: res.photo.fileReference - }, - ttlSeconds: media.ttlSeconds - } + }, true) } if ('thumb' in media && media.thumb) { @@ -185,7 +204,7 @@ export async function _normalizeInputMedia( }) } - const ret: tl.RawInputMediaUploadedDocument = { + return uploadMediaIfNeeded({ _: 'inputMediaUploadedDocument', nosoundVideo: media.type === 'video' && media.isAnimated, forceFile: media.type === 'document', @@ -194,27 +213,5 @@ export async function _normalizeInputMedia( mimeType: mime, attributes, ttlSeconds: media.ttlSeconds - } - - if (!uploadMedia) return ret - - const res = await this.call({ - _: 'messages.uploadMedia', - peer: { _: 'inputPeerSelf' }, - media: ret - }) - - assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res, 'messageMediaDocument') - assertTypeIs('normalizeInputMedia (@ messages.uploadMedia)', res.document!, 'document') - - return { - _: 'inputMediaDocument', - id: { - _: 'inputDocument', - id: res.document.id, - accessHash: res.document.accessHash, - fileReference: res.document.fileReference - }, - ttlSeconds: media.ttlSeconds - } + }, false) }