From b6a696a08de320602373f9796689570ca4b936da Mon Sep 17 00:00:00 2001 From: Toni Barth Date: Tue, 5 Mar 2024 12:38:16 +0100 Subject: [PATCH] add hit post-processing via ffmpeg to convert to mp3 and cut off the beginning according to the offset --- Dockerfile | 2 +- server/Cargo.toml | 1 + server/src/hits.rs | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index a72474d..4dc4a84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,7 @@ FROM debian:bookworm-slim # prepare the OS RUN DEBIAN_FRONTEND=noninteractive apt-get update && \ - apt-get -y install --no-install-recommends libssl-dev ca-certificates && \ + apt-get -y install --no-install-recommends libssl-dev ca-certificates ffmpeg && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* diff --git a/server/Cargo.toml b/server/Cargo.toml index 4c670dd..55aabf2 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] dotenvy = "0.15.7" +ffmpeg-cli = "0.1.0" hex = "0.4.3" names = "0.14.0" regex = "1.10.3" diff --git a/server/src/hits.rs b/server/src/hits.rs index a52bb09..02f4497 100644 --- a/server/src/hits.rs +++ b/server/src/hits.rs @@ -1,10 +1,16 @@ +use ffmpeg_cli::{FfmpegBuilder, File, Parameter}; use regex::Regex; use rocket::{ fairing::{Fairing, Info, Kind}, Orbit, Rocket, }; use rusty_ytdl::{Video, VideoOptions, VideoQuality, VideoSearchOptions}; -use std::{env, fs::create_dir_all, path::Path}; +use std::{ + env, + fs::{create_dir_all, remove_file}, + path::Path, + process::Stdio, +}; include!(concat!(env!("OUT_DIR"), "/hits.rs")); @@ -63,9 +69,34 @@ impl Fairing for HitsterDownloader { ); video - .download(format!("{}/{}.mp4", download_dir.as_str(), id)) + .download(format!("{}/{}.opus", download_dir.as_str(), id)) .await .unwrap(); + + println!("Post-processing opus to mp3..."); + + let in_file = format!("{}/{}.opus", download_dir.as_str(), id); + let out_file = format!("{}/{}.mp3", download_dir.as_str(), id); + let offset = format!("{}", hit.playback_offset); + + let builder = FfmpegBuilder::new() + .stderr(Stdio::piped()) + .option(Parameter::Single("nostdin")) + .option(Parameter::Single("y")) + .input(File::new(in_file.as_str())) + .output( + File::new(out_file.as_str()) + .option(Parameter::KeyValue("ss", offset.as_str())) + .option(Parameter::Single("vn")) + .option(Parameter::Single("sn")) + .option(Parameter::Single("dn")), + ); + + let ffmpeg = builder.run().await.unwrap(); + + ffmpeg.process.wait_with_output().unwrap(); + + remove_file(in_file.as_str()).unwrap(); } } }