Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 9d1c0fb

Browse files
authored
Merge pull request #45 from AssemblyAI/niels/add-more-transcript-overloads
Add more overloads to upload files, submit, and transcribe
2 parents c9c8ead + 193523d commit 9d1c0fb

File tree

4 files changed

+166
-13
lines changed

4 files changed

+166
-13
lines changed

src/AssemblyAI.IntegrationTests/FilesClientTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,21 @@ public async Task Should_Upload_File_Using_Stream()
3434
Assert.That(uploadedFile, Is.Not.Null);
3535
Assert.That(uploadedFile.UploadUrl, Is.Not.Null);
3636
}
37+
38+
[Test]
39+
public async Task Should_Upload_File_Using_Stream_With_Dispose()
40+
{
41+
// Assuming there's a method to create a configured RawClient instance
42+
var client = Helpers.CreateClient();
43+
44+
// Adjust the path to where your test file is located
45+
var testFilePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "nbc.mp3");
46+
var fileStream = File.OpenRead(testFilePath);
47+
48+
var uploadedFile = await client.Files.UploadAsync(fileStream, disposeStream: true).ConfigureAwait(false);
49+
50+
Assert.That(uploadedFile, Is.Not.Null);
51+
Assert.That(uploadedFile.UploadUrl, Is.Not.Null);
52+
Assert.Throws<ObjectDisposedException>(() => fileStream.ReadByte());
53+
}
3754
}

src/AssemblyAI.IntegrationTests/TranscriptsClientTests.cs

Lines changed: 89 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using AssemblyAI.Files;
12
using AssemblyAI.Transcripts;
23

34
namespace AssemblyAI.IntegrationTests;
@@ -48,6 +49,27 @@ public async Task Should_Submit_Using_Stream()
4849
});
4950
}
5051

52+
[Test]
53+
public async Task Should_Submit_Using_Stream_With_Dispose()
54+
{
55+
var client = Helpers.CreateClient();
56+
57+
// Adjust the path to where your test file is located
58+
var testFilePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "nbc.mp3");
59+
var stream = File.OpenRead(testFilePath);
60+
61+
var transcript = await client.Transcripts.SubmitAsync(stream, disposeStream: true).ConfigureAwait(false);
62+
63+
Assert.That(transcript, Is.Not.Null);
64+
Assert.Multiple(() =>
65+
{
66+
Assert.That(transcript.Id, Is.Not.Null);
67+
Assert.That(transcript.Text, Is.Null);
68+
Assert.That(transcript.Status, Is.EqualTo(TranscriptStatus.Queued));
69+
});
70+
Assert.Throws<ObjectDisposedException>(() => stream.ReadByte());
71+
}
72+
5173
[Test]
5274
public async Task Should_Submit_Using_FileInfo()
5375
{
@@ -68,15 +90,35 @@ public async Task Should_Submit_Using_FileInfo()
6890
});
6991
}
7092

93+
94+
[Test]
95+
public async Task Should_Submit_Using_UploadedFile()
96+
{
97+
var client = Helpers.CreateClient();
98+
99+
var transcript = await client.Transcripts.SubmitAsync(new UploadedFile
100+
{
101+
UploadUrl = RemoteAudioUrl
102+
}).ConfigureAwait(false);
103+
104+
Assert.That(transcript, Is.Not.Null);
105+
Assert.Multiple(() =>
106+
{
107+
Assert.That(transcript.Id, Is.Not.Null);
108+
Assert.That(transcript.Text, Is.Null);
109+
Assert.That(transcript.Status, Is.EqualTo(TranscriptStatus.Queued));
110+
});
111+
}
112+
71113
[Test]
72114
public async Task Should_Transcribe_Using_Params()
73115
{
74116
var client = Helpers.CreateClient();
75117

76118
var transcript = await client.Transcripts.TranscribeAsync(new TranscriptParams
77-
{
78-
AudioUrl = RemoteAudioUrl
79-
}
119+
{
120+
AudioUrl = RemoteAudioUrl
121+
}
80122
).ConfigureAwait(false);
81123

82124
Assert.That(transcript, Is.Not.Null);
@@ -127,6 +169,25 @@ public async Task Should_Transcribe_From_FileInfo()
127169
});
128170
}
129171

172+
[Test]
173+
public async Task Should_Transcribe_From_UploadedFile()
174+
{
175+
var client = Helpers.CreateClient();
176+
177+
var transcript = await client.Transcripts.TranscribeAsync(new UploadedFile
178+
{
179+
UploadUrl = RemoteAudioUrl
180+
}).ConfigureAwait(false);
181+
182+
Assert.That(transcript, Is.Not.Null);
183+
Assert.Multiple(() =>
184+
{
185+
Assert.That(transcript.Id, Is.Not.Null);
186+
Assert.That(transcript.Text, Is.Not.Empty);
187+
Assert.That(transcript.Status, Is.EqualTo(TranscriptStatus.Completed));
188+
});
189+
}
190+
130191
[Test]
131192
public async Task Should_Transcribe_Using_Stream()
132193
{
@@ -147,6 +208,28 @@ public async Task Should_Transcribe_Using_Stream()
147208
});
148209
}
149210

211+
[Test]
212+
public async Task Should_Transcribe_Using_Stream_With_Dispose()
213+
{
214+
var client = Helpers.CreateClient();
215+
216+
// Adjust the path to where your test file is located
217+
var testFilePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "TestData", "nbc.mp3");
218+
var stream = File.OpenRead(testFilePath);
219+
220+
var transcript = await client.Transcripts.TranscribeAsync(stream, disposeStream: true).ConfigureAwait(false);
221+
222+
Assert.That(transcript, Is.Not.Null);
223+
Assert.Multiple(() =>
224+
{
225+
Assert.That(transcript.Id, Is.Not.Null);
226+
Assert.That(transcript.Text, Is.Not.Empty);
227+
Assert.That(transcript.Status, Is.EqualTo(TranscriptStatus.Completed));
228+
});
229+
230+
Assert.Throws<ObjectDisposedException>(() => stream.ReadByte());
231+
}
232+
150233
[Test]
151234
public async Task Should_Fail_To_Transcribe()
152235
{
@@ -314,8 +397,9 @@ public async Task Should_Get_Redacted_Audio()
314397
}).ConfigureAwait(false);
315398

316399
var redactedAudioResponse = await client.Transcripts.GetRedactedAudioAsync(transcript.Id).ConfigureAwait(false);
317-
318-
var redactedAudioFileStream = await client.Transcripts.GetRedactedAudioFileAsync(transcript.Id).ConfigureAwait(false);
400+
401+
var redactedAudioFileStream =
402+
await client.Transcripts.GetRedactedAudioFileAsync(transcript.Id).ConfigureAwait(false);
319403
var memoryStream = new MemoryStream();
320404
await redactedAudioFileStream.CopyToAsync(memoryStream).ConfigureAwait(false);
321405

src/AssemblyAI/Files/ExtendedFilesClient.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,21 @@ public partial class FilesClient
55
/// <summary>
66
/// Upload a media file to AssemblyAI's servers.
77
/// </summary>
8-
public async Task<UploadedFile> UploadAsync(FileInfo audioFile)
8+
public async Task<UploadedFile> UploadAsync(FileInfo audioFile, RequestOptions? options = null)
99
{
1010
using var audioFileStream = audioFile.OpenRead();
11-
return await UploadAsync(audioFileStream).ConfigureAwait(false);
11+
return await UploadAsync(audioFileStream, options).ConfigureAwait(false);
12+
}
13+
14+
/// <summary>
15+
/// Upload a media file to AssemblyAI's servers.
16+
/// </summary>
17+
public async Task<UploadedFile> UploadAsync(Stream stream, bool disposeStream, RequestOptions? options = null)
18+
{
19+
if (!disposeStream) return await UploadAsync(stream, options).ConfigureAwait(false);
20+
using (stream)
21+
{
22+
return await UploadAsync(stream, options).ConfigureAwait(false);
23+
}
1224
}
1325
}

src/AssemblyAI/Transcripts/ExtendedTranscriptsClient.cs

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Text.Json;
33
using System.Text.Json.Nodes;
44
using AssemblyAI.Core;
5+
using AssemblyAI.Files;
6+
57
// ReSharper disable MemberCanBePrivate.Global
68
// ReSharper disable UnusedMember.Global
79

@@ -22,17 +24,28 @@ internal ExtendedTranscriptsClient(RawClient client, AssemblyAIClient assemblyAI
2224

2325
public async Task<Transcript> SubmitAsync(FileInfo audioFile, TranscriptOptionalParams transcriptParams)
2426
{
25-
using var audioFileStream = audioFile.OpenRead();
26-
return await SubmitAsync(audioFileStream, transcriptParams).ConfigureAwait(false);
27+
var uploadedFile = await _assemblyAIClient.Files.UploadAsync(audioFile).ConfigureAwait(false);
28+
return await SubmitAsync(uploadedFile, transcriptParams).ConfigureAwait(false);
2729
}
2830

2931
public Task<Transcript> SubmitAsync(Stream audioFileStream) =>
3032
SubmitAsync(audioFileStream, new TranscriptOptionalParams());
3133

32-
public async Task<Transcript> SubmitAsync(Stream audioFileStream, TranscriptOptionalParams transcriptParams)
34+
public Task<Transcript> SubmitAsync(Stream audioFileStream, bool disposeStream) =>
35+
SubmitAsync(audioFileStream, disposeStream, new TranscriptOptionalParams());
36+
37+
public Task<Transcript> SubmitAsync(Stream audioFileStream, TranscriptOptionalParams transcriptParams)
38+
=> SubmitAsync(audioFileStream, false, transcriptParams);
39+
40+
public async Task<Transcript> SubmitAsync(
41+
Stream audioFileStream,
42+
bool disposeStream,
43+
TranscriptOptionalParams transcriptParams
44+
)
3345
{
34-
var fileUpload = await _assemblyAIClient.Files.UploadAsync(audioFileStream).ConfigureAwait(false);
35-
return await SubmitAsync(new Uri(fileUpload.UploadUrl), transcriptParams).ConfigureAwait(false);
46+
var fileUpload = await _assemblyAIClient.Files.UploadAsync(audioFileStream, disposeStream)
47+
.ConfigureAwait(false);
48+
return await SubmitAsync(fileUpload, transcriptParams).ConfigureAwait(false);
3649
}
3750

3851
public Task<Transcript> SubmitAsync(Uri audioFileUrl) => SubmitAsync(audioFileUrl, new TranscriptOptionalParams());
@@ -42,6 +55,13 @@ public async Task<Transcript> SubmitAsync(Uri audioFileUrl, TranscriptOptionalPa
4255
return await SubmitAsync(CreateParams(audioFileUrl, transcriptParams)).ConfigureAwait(false);
4356
}
4457

58+
public Task<Transcript> SubmitAsync(UploadedFile file) => SubmitAsync(file, new TranscriptOptionalParams());
59+
60+
public async Task<Transcript> SubmitAsync(UploadedFile file, TranscriptOptionalParams transcriptParams)
61+
{
62+
return await SubmitAsync(CreateParams(file.UploadUrl, transcriptParams)).ConfigureAwait(false);
63+
}
64+
4565
public Task<Transcript> TranscribeAsync(FileInfo audioFile) =>
4666
TranscribeAsync(audioFile, new TranscriptOptionalParams());
4767

@@ -54,18 +74,35 @@ public async Task<Transcript> TranscribeAsync(FileInfo audioFile, TranscriptOpti
5474
public Task<Transcript> TranscribeAsync(Stream audioFileStream) =>
5575
TranscribeAsync(audioFileStream, new TranscriptOptionalParams());
5676

77+
public Task<Transcript> TranscribeAsync(Stream audioFileStream, bool disposeStream) =>
78+
TranscribeAsync(audioFileStream, disposeStream, new TranscriptOptionalParams());
79+
5780
public async Task<Transcript> TranscribeAsync(Stream audioFileStream, TranscriptOptionalParams transcriptParams)
5881
{
5982
var fileUpload = await _assemblyAIClient.Files.UploadAsync(audioFileStream).ConfigureAwait(false);
6083
return await TranscribeAsync(new Uri(fileUpload.UploadUrl), transcriptParams).ConfigureAwait(false);
6184
}
6285

86+
public async Task<Transcript> TranscribeAsync(Stream audioFileStream, bool disposeStream,
87+
TranscriptOptionalParams transcriptParams)
88+
{
89+
var uploadedFile =
90+
await _assemblyAIClient.Files.UploadAsync(audioFileStream, disposeStream).ConfigureAwait(false);
91+
return await TranscribeAsync(uploadedFile, transcriptParams).ConfigureAwait(false);
92+
}
93+
6394
public Task<Transcript> TranscribeAsync(Uri audioFileUrl) =>
6495
TranscribeAsync(audioFileUrl, new TranscriptOptionalParams());
6596

6697
public Task<Transcript> TranscribeAsync(Uri audioFileUrl, TranscriptOptionalParams transcriptParams)
6798
=> TranscribeAsync(CreateParams(audioFileUrl, transcriptParams));
6899

100+
public Task<Transcript> TranscribeAsync(UploadedFile file) =>
101+
TranscribeAsync(file, new TranscriptOptionalParams());
102+
103+
public Task<Transcript> TranscribeAsync(UploadedFile file, TranscriptOptionalParams transcriptParams)
104+
=> TranscribeAsync(CreateParams(file.UploadUrl, transcriptParams));
105+
69106
public async Task<Transcript> TranscribeAsync(TranscriptParams transcriptParams)
70107
{
71108
var transcript = await SubmitAsync(transcriptParams).ConfigureAwait(false);
@@ -114,10 +151,13 @@ public async Task<Transcript> WaitUntilReady(
114151
}
115152

116153
private static TranscriptParams CreateParams(Uri audioFileUrl, TranscriptOptionalParams optionalTranscriptParams)
154+
=> CreateParams(audioFileUrl.ToString(), optionalTranscriptParams);
155+
156+
private static TranscriptParams CreateParams(string audioFileUrl, TranscriptOptionalParams optionalTranscriptParams)
117157
{
118158
var json = JsonUtils.Serialize(optionalTranscriptParams);
119159
var jsonObject = JsonUtils.Deserialize<JsonObject>(json);
120-
jsonObject["audio_url"] = audioFileUrl.ToString();
160+
jsonObject["audio_url"] = audioFileUrl;
121161
var transcriptParams = jsonObject.Deserialize<TranscriptParams>()!;
122162
return transcriptParams;
123163
}

0 commit comments

Comments
 (0)