diff options
Diffstat (limited to 'src/commands')
| -rw-r--r-- | src/commands/meme.rs | 98 |
1 files changed, 32 insertions, 66 deletions
diff --git a/src/commands/meme.rs b/src/commands/meme.rs index a8ac417..913be00 100644 --- a/src/commands/meme.rs +++ b/src/commands/meme.rs @@ -1,5 +1,5 @@ use std::{ - io::{BufReader, Read}, + io::Read, process::{ Command, Stdio, @@ -7,14 +7,8 @@ use std::{ sync::RwLock, }; -use byteorder::{ - ByteOrder, - NativeEndian, -}; use diesel::PgConnection; use failure::Error; -use lame_sys; -use lame_sys::lame_set_brate; use lazy_static::lazy_static; use rand::{Rng, thread_rng}; use serenity::{ @@ -31,11 +25,7 @@ use audio::ytdl_url; use crate::{ audio::{ CtxExt, - ffmpeg_dl, - Mp3, - Opus, parse_times, - Pcm, PlayArgs, PlayQueue, }, @@ -162,22 +152,39 @@ 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 ffmpeg_command = ffmpeg_dl::<Pcm>(&youtube_url, start, end, None)?; - let lame = Command::new("lame") + 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(&[ - "-r", - "-m", "s", - "-s", "48", - "-V", "2", - "-b", "96", - "-", "-", + "-ac", "2", + "-ar", "48000", + "-f", "opus", + "-acodec", "libopus", + "-b:a", "96k", + "-", ]) - .stdin(ffmpeg_command.stdout.unwrap()) .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(" "), Err(_) => "".to_owned(), @@ -196,53 +203,12 @@ pub fn addaudiomeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<() .ok(); let mut audio_data = Vec::new(); - lame.stdout.unwrap().read_to_end(&mut audio_data)?; - -// let mut 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 -// }; -// -// if i16_data.len() == 0 { -// debug!("read 0 bytes from audio reader"); -// return send(msg.channel_id, "🔇🔇🔇🔕🔕🔕🔕🔕🔇🔕🔕🔇🔕🔕📣📢📣📢📣", msg.tts); -// } -// -// let audio_data = unsafe { -// let lame_flags = lame_sys::lame_init(); -// -// lame_sys::lame_set_brate(lame_flags, 96000); -// lame_sys::lame_set_num_channels(lame_flags, 2); -// lame_sys::lame_set_num_samples(lame_flags, 48000); -// -// let mut out = Vec::<u8>::with_capacity(i16_data.len() * 2); -// out.resize(i16_data.len() * 2, 0); -// -// let result = lame_sys::lame_encode_buffer_interleaved( -// lame_flags, -// i16_data.as_mut_ptr(), -// (i16_data.len() / 2) as i32, -// out.as_mut_ptr(), -// out.len() as i32, -// ); -// -// if result <= 0 { -// debug!("return code {} from lame", result); -// return send(msg.channel_id, "wat", msg.tts); -// } -// -// out.truncate(result as usize); -// -// out -// }; + let bytes = audio_reader.read_to_end(&mut audio_data)?; + if bytes == 0 { + debug!("read 0 bytes from audio reader"); + return send(msg.channel_id, "🔇🔇🔇🔕🔕🔕🔕🔕🔇🔕🔕🔇🔕🔕📣📢📣📢📣", msg.tts); + } let audio_id = Audio::create(&conn, audio_data, msg.author.id.0)?; |
