diff --git a/src/app/services/mastodon.service.ts b/src/app/services/mastodon.service.ts index cc69ce0f..61fdffdb 100644 --- a/src/app/services/mastodon.service.ts +++ b/src/app/services/mastodon.service.ts @@ -396,16 +396,43 @@ export class MastodonService { } uploadMediaAttachment(account: AccountInfo, file: File, description: string): Promise { - let input = new FormData(); - input.append('file', file); - if (description !== null && description !== undefined) { - input.append('description', description); - } else { - input.append('description', ''); - } - const route = `https://${account.instance}${this.apiRoutes.uploadMediaAttachment}`; - const headers = new HttpHeaders({ 'Authorization': `Bearer ${account.token.access_token}` }); - return this.httpClient.post(route, input, { headers: headers }).toPromise(); + return new Promise((resolve, reject) => { + let input = new FormData(); + input.append('file', file); + if (description !== null && description !== undefined) { + input.append('description', description); + } else { + input.append('description', ''); + } + const route = `https://${account.instance}${this.apiRoutes.uploadMediaAttachment}`; + const headers = new HttpHeaders({ 'Authorization': `Bearer ${account.token.access_token}` }); + + this.httpClient.post(route, input, { headers: headers, observe: 'response' }) + .subscribe(response => { + if (response.status === 202) { + let tryCount = 1; + const checkMediaStatus = () => { + this.httpClient.get(`https://${account.instance}${this.apiRoutes.updateMediaAttachment.replace('{0}', response.body.id)}`, { headers: headers }) + .subscribe(mediaStatus => { + if (mediaStatus.url) { + resolve(mediaStatus); + } else { + const retryAfter = (Math.log2(tryCount) || 1) * 1000; + tryCount += 1; + setTimeout(checkMediaStatus, retryAfter); + } + }, error => { + reject(error); + }); + }; + checkMediaStatus(); + } else { + resolve(response.body); + } + }, error => { + reject(error); + }); + }); } //TODO: add focus support @@ -741,4 +768,4 @@ export class FollowingResult { constructor( public maxId: string, public follows: Account[]) { } -} \ No newline at end of file +} diff --git a/src/app/services/models/api.settings.ts b/src/app/services/models/api.settings.ts index 6a36c09f..b9b5ff73 100644 --- a/src/app/services/models/api.settings.ts +++ b/src/app/services/models/api.settings.ts @@ -27,7 +27,7 @@ export class ApiRoutes { followRemote = '/api/v1/follows'; getInstance = '/api/v1/instance'; getInstancev2 = '/api/v2/instance'; - uploadMediaAttachment = '/api/v1/media'; + uploadMediaAttachment = '/api/v2/media'; updateMediaAttachment = '/api/v1/media/{0}'; getMutes = '/api/v1/mutes'; getNotifications = '/api/v1/notifications';