diff options
Diffstat (limited to 'src/commands/meme.rs')
| -rw-r--r-- | src/commands/meme.rs | 88 |
1 files changed, 41 insertions, 47 deletions
diff --git a/src/commands/meme.rs b/src/commands/meme.rs index e4fbde8..913be00 100644 --- a/src/commands/meme.rs +++ b/src/commands/meme.rs @@ -1,21 +1,15 @@ use std::{ - io::{BufReader, Read}, + io::Read, + process::{ + Command, + Stdio, + }, sync::RwLock, }; -use byteorder::{ - ByteOrder, - NativeEndian, -}; use diesel::PgConnection; use failure::Error; use lazy_static::lazy_static; -use opus::{ - Application, - Bitrate, - Channels, - Encoder as OpusEncoder, -}; use rand::{Rng, thread_rng}; use serenity::{ builder::CreateMessage, @@ -31,9 +25,7 @@ use audio::ytdl_url; use crate::{ audio::{ CtxExt, - ffmpeg_dl, parse_times, - Pcm, PlayArgs, PlayQueue, }, @@ -160,7 +152,38 @@ pub fn addaudiomeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<() let (start, end) = parse_times(opts); let youtube_url = ytdl_url(audio_link.as_str())?; - let mut audio_reader = BufReader::new(ffmpeg_dl::<Pcm>(&youtube_url, start, end, None)?); + + let duration_opts = if let Some(e) = end { + vec! [ + "-ss".to_owned(), start.map_or_else( + || "00:00:00".to_owned(), + |s| format!("{:02}:{:02}:{:02}", s.num_hours(), s.num_minutes() % 60, s.num_seconds() % 60) + ), + + "-to".to_owned(), format!("{:02}:{:02}:{:02}", e.num_hours(), e.num_minutes() % 60, e.num_seconds() % 60), + ] + } else { + vec! [] + }; + + let ffmpeg_command = Command::new("ffmpeg") + .arg("-i") + .arg(youtube_url) + .args(duration_opts) + .args(&[ + "-ac", "2", + "-ar", "48000", + "-f", "opus", + "-acodec", "libopus", + "-b:a", "96k", + "-", + ]) + .stdout(Stdio::piped()) + .stderr(Stdio::null()) + .stdin(Stdio::null()) + .spawn()?; + + let mut audio_reader = ffmpeg_command.stdout.unwrap(); let text = match args.multiple_quoted::<String>() { Ok(text) => text.join(" "), @@ -179,44 +202,15 @@ pub fn addaudiomeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<() }) .ok(); - let i16_data: Vec<i16> = { - let mut audio_data = Vec::new(); - let bytes = audio_reader.read_to_end(&mut audio_data)?; - - let mut i16_data = Vec::with_capacity(bytes / 2); - i16_data.resize(bytes / 2, 0); - - NativeEndian::read_i16_into(&audio_data, &mut i16_data); - - i16_data - }; - - let mut enc = OpusEncoder::new(48000, Channels::Stereo, Application::Audio)?; - enc.set_vbr(false)?; - enc.set_bitrate(Bitrate::Bits(96 * 1024))?; - - let mut out = Vec::new(); - for elem in i16_data.chunks(960) { - let elem = if elem.len() == 960 { - elem - } else if elem.len() > 480 { - &elem[..480] - } else if elem.len() > 240 { - &elem[..240] - } else { - continue - }; - - let mut encoded = enc.encode_vec(elem, 1200)?; - out.append(&mut encoded); - } + let mut audio_data = Vec::new(); + let bytes = audio_reader.read_to_end(&mut audio_data)?; - if out.len() == 0 { + if bytes == 0 { debug!("read 0 bytes from audio reader"); return send(msg.channel_id, "🔇🔇🔇🔕🔕🔕🔕🔕🔇🔕🔕🔇🔕🔕📣📢📣📢📣", msg.tts); } - let audio_id = Audio::create(&conn, out, msg.author.id.0)?; + let audio_id = Audio::create(&conn, audio_data, msg.author.id.0)?; NewMeme { title, |
