Skip to content

Commit 039ecf6

Browse files
authored
Update uploadMedia to use new dedicated endpoints for chunked media upload in V2 (#584)
1 parent 169e71c commit 039ecf6

File tree

2 files changed

+5
-21
lines changed

2 files changed

+5
-21
lines changed

src/types/v2/media.v2.types.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
11
export type MediaV2MediaCategory = 'tweet_image' | 'tweet_video' | 'tweet_gif' | 'dm_image' | 'dm_video' | 'dm_gif' | 'subtitles';
22

33
export interface MediaV2UploadInitParams {
4-
command: 'INIT';
54
media_type: string;
65
total_bytes: number;
76
media_category?: MediaV2MediaCategory;
87
}
98

109
export interface MediaV2UploadAppendParams {
11-
command: 'APPEND';
12-
media_id: string;
1310
segment_index: number;
1411
media: Buffer;
1512
}
1613

17-
export interface MediaV2UploadFinalizeParams {
18-
command: 'FINALIZE';
19-
media_id: string;
20-
}
21-
2214
export interface MediaV2ProcessingInfo {
2315
state: 'pending' | 'in_progress' | 'failed' | 'succeeded';
2416
check_after_secs?: number;
@@ -49,4 +41,4 @@ export interface MediaV2MetadataCreateResult {
4941
alt_text: { text: string };
5042
};
5143
};
52-
}
44+
}

src/v2/client.v2.write.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import type {
2424
} from '../types';
2525
import TwitterApiv2LabsReadWrite from '../v2-labs/client.v2.labs.write';
2626
import { CreateDMConversationParams, PostDMInConversationParams, PostDMInConversationResult } from '../types/v2/dm.v2.types';
27-
import { MediaV2MediaCategory, MediaV2MetadataCreateParams, MediaV2MetadataCreateResult, MediaV2UploadAppendParams, MediaV2UploadFinalizeParams, MediaV2UploadInitParams, MediaV2UploadResponse } from '../types/v2/media.v2.types';
27+
import { MediaV2MediaCategory, MediaV2MetadataCreateParams, MediaV2MetadataCreateResult, MediaV2UploadAppendParams, MediaV2UploadInitParams, MediaV2UploadResponse } from '../types/v2/media.v2.types';
2828

2929
/**
3030
* Base Twitter v2 client with read/write rights.
@@ -150,13 +150,12 @@ export default class TwitterApiv2ReadWrite extends TwitterApiv2ReadOnly {
150150
}
151151

152152
const initArguments: MediaV2UploadInitParams = {
153-
command: 'INIT',
154153
media_type: options.media_type,
155154
total_bytes: media.length,
156155
media_category,
157156
};
158157

159-
const initResponse = await this.post<MediaV2UploadResponse>('media/upload', initArguments, { forceBodyMode: 'form-data' });
158+
const initResponse = await this.post<MediaV2UploadResponse>('media/upload/initialize', initArguments, { forceBodyMode: 'form-data' });
160159
const mediaId = initResponse.data.id;
161160

162161
const chunksCount = Math.ceil(media.length / chunkSize);
@@ -168,21 +167,14 @@ export default class TwitterApiv2ReadWrite extends TwitterApiv2ReadOnly {
168167
const chunkedBuffer = Buffer.from(mediaChunk);
169168

170169
const appendArguments: MediaV2UploadAppendParams = {
171-
command: 'APPEND',
172-
media_id: mediaId,
173170
segment_index: i,
174171
media: chunkedBuffer,
175172
};
176173

177-
await this.post('media/upload', appendArguments, { forceBodyMode: 'form-data' });
174+
await this.post(`media/upload/${mediaId}/append`, appendArguments, { forceBodyMode: 'form-data' });
178175
}
179176

180-
const finalizeArguments: MediaV2UploadFinalizeParams = {
181-
command: 'FINALIZE',
182-
media_id: mediaId,
183-
};
184-
185-
const finalizeResponse = await this.post<MediaV2UploadResponse>('media/upload', finalizeArguments, { forceBodyMode: 'form-data' });
177+
const finalizeResponse = await this.post<MediaV2UploadResponse>(`media/upload/${mediaId}/finalize`);
186178
if (finalizeResponse.data.processing_info) {
187179
await this.waitForMediaProcessing(mediaId);
188180
}

0 commit comments

Comments
 (0)