aboutsummaryrefslogtreecommitdiff
path: root/src/commands/meme.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/meme.rs')
-rw-r--r--src/commands/meme.rs88
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,