Skip to content

Commit 468a656

Browse files
committed
Lazily load audio instead of prefetching it
1 parent 1bd3708 commit 468a656

14 files changed

Lines changed: 143 additions & 87 deletions

File tree

Cargo.lock

Lines changed: 49 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "tts_bot"
33
version = "0.1.0"
44
edition = "2024"
5-
rust-version = "1.93"
5+
rust-version = "1.94"
66

77
[workspace]
88
members = [
@@ -18,8 +18,9 @@ lto = "thin"
1818
panic = "abort"
1919
debug = 2
2020

21-
[profile.dev.package.syn]
22-
opt-level = 3
21+
[profile.dev]
22+
panic = "abort"
23+
package = { syn = { opt-level = 3 } }
2324

2425
[lints]
2526
workspace = true

flake.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
outputHashes = {
3232
"audiopus_sys-0.2.2" = "sha256-epzB54105Iihrfyj1HZNGSLOaihLw4rUZsT+rw/sXZs=";
3333
"poise-0.6.1" = "sha256-qCTEkOWCpKgEXCt7apg+tiScE+X0Br0giTNNBxqNCs0=";
34-
"serenity-0.12.5" = "sha256-AyXiT2rr+//LeLPxPYaa+TqCuKXN9dpdZf2IjyXrbfU=";
34+
"serenity-0.12.5" = "sha256-8I9rGKL/a8jwbLnDYV/jZEi+rDuLAn6Nk/QAJr00Kxo=";
3535
"serenity-voice-model-0.3.0" = "sha256-ZGwzX+saQ7RY8BtpuxzCC24vc/uQWuRWoi88ZzuJL1o=";
3636
"songbird-0.5.0" = "sha256-wacSNkIjA1rsENNPbo/KVDfoMXllrr+vA2pmPxsNzEs=";
3737
};

tts_commands/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "tts_commands"
33
version = "0.1.0"
44
edition = "2024"
5-
rust-version = "1.93"
5+
rust-version = "1.94"
66

77
[dependencies]
88
indexmap = "2.13.0"

tts_commands/src/other.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,7 @@ async fn tts_(ctx: Context<'_>, author: &serenity::User, message: &str) -> Comma
133133
let auth_key = data.config.tts_service_auth_key.as_deref();
134134
let audio = fetch_audio(&data.reqwest, url, auth_key)
135135
.await?
136-
.try_unwrap()?
137-
.bytes()
138-
.await?;
136+
.try_unwrap()?;
139137

140138
let mut file_name = author_name;
141139
file_name.push_str(&aformat!(
@@ -147,7 +145,7 @@ async fn tts_(ctx: Context<'_>, author: &serenity::User, message: &str) -> Comma
147145
}
148146
));
149147

150-
serenity::CreateAttachment::bytes(audio.to_vec(), file_name)
148+
serenity::CreateAttachment::bytes(audio, file_name)
151149
};
152150

153151
ctx.send(

tts_core/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
name = "tts_core"
33
version = "0.1.0"
44
edition = "2024"
5-
rust-version = "1.93"
5+
rust-version = "1.94"
66

77
[dependencies]
88
rand = "0.10"
99
sha2 = "0.10.9"
10+
bytes = "1.11.1"
1011
linkify = "0.10"
1112
bitflags = "2.11.0"
1213
strum_macros = "0.28"

tts_core/src/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,15 @@ pub async fn fetch_audio(
9494
reqwest: &reqwest::Client,
9595
url: reqwest::Url,
9696
auth_key: Option<&str>,
97-
) -> Result<Option<reqwest::Response>> {
97+
) -> Result<Option<bytes::Bytes>> {
9898
let resp = reqwest
9999
.get(url)
100100
.header(reqwest::header::AUTHORIZATION, auth_key.unwrap_or(""))
101101
.send()
102102
.await?;
103103

104104
match resp.error_for_status_ref() {
105-
Ok(_) => Ok(Some(resp)),
105+
Ok(_) => Ok(Some(resp.bytes().await?)),
106106
Err(backup_err) => match resp.json::<TTSServiceError>().await {
107107
Ok(err) => {
108108
if err.code.should_ignore() {

tts_core/src/errors.rs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -532,31 +532,46 @@ struct TrackErrorHandler {
532532
icon_url: String,
533533
}
534534

535-
#[serenity::async_trait]
536-
impl songbird::EventHandler for TrackErrorHandler {
537-
async fn act(&self, ctx: &songbird::EventContext<'_>) -> Option<songbird::Event> {
538-
if let songbird::EventContext::Track([(state, _)]) = ctx
539-
&& let songbird::tracks::PlayMode::Errored(error) = state.playing.clone()
535+
impl TrackErrorHandler {
536+
async fn log_if_error(&self, ctx: &songbird::EventContext<'_>) {
537+
let songbird::EventContext::Track([(state, _)]) = ctx else {
538+
return;
539+
};
540+
541+
let songbird::tracks::PlayMode::Errored(error) = state.playing.clone() else {
542+
return;
543+
};
544+
545+
if let songbird::error::PlayError::Create(create_error) = &error
546+
&& let songbird::input::AudioStreamError::Unsupported = **create_error
540547
{
541-
let mut extra_fields_iter = self.extra_fields.iter().cloned();
542-
let author_name = Some(self.author_name.as_str());
543-
let icon_url = Some(self.icon_url.as_str());
544-
545-
let result = handle_unexpected(
546-
&self.ctx,
547-
"TrackError",
548-
error.into(),
549-
extra_fields_iter.by_ref(),
550-
author_name,
551-
icon_url,
552-
)
553-
.await;
548+
return;
549+
}
554550

555-
if let Err(err_err) = result {
556-
tracing::error!("Songbird unhandled track error: {err_err}");
557-
}
551+
let mut extra_fields_iter = self.extra_fields.iter().cloned();
552+
let author_name = Some(self.author_name.as_str());
553+
let icon_url = Some(self.icon_url.as_str());
554+
555+
let result = handle_unexpected(
556+
&self.ctx,
557+
"TrackError",
558+
error.into(),
559+
extra_fields_iter.by_ref(),
560+
author_name,
561+
icon_url,
562+
)
563+
.await;
564+
565+
if let Err(err_err) = result {
566+
tracing::error!("Songbird unhandled track error: {err_err}");
558567
}
568+
}
569+
}
559570

571+
#[serenity::async_trait]
572+
impl songbird::EventHandler for TrackErrorHandler {
573+
async fn act(&self, ctx: &songbird::EventContext<'_>) -> Option<songbird::Event> {
574+
self.log_if_error(ctx).await;
560575
Some(songbird::Event::Cancel)
561576
}
562577
}

tts_core/src/structs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ pub struct Config {
5959

6060
#[derive(serde::Deserialize)]
6161
pub struct MainConfig {
62-
pub tts_service_auth_key: Option<FixedString>,
62+
pub tts_service_auth_key: Option<Arc<str>>,
6363
pub website_url: Option<reqwest::Url>,
6464
pub announcements_channel: ChannelId,
6565
pub main_server_invite: FixedString,

0 commit comments

Comments
 (0)