(Re-)add download pipe to stdout

This commit is contained in:
ByteDream 2023-01-13 16:03:19 +01:00
parent 6d1f8d49f6
commit 08c4e30a06

View file

@ -19,8 +19,7 @@ use crunchyroll_rs::{
}; };
use log::{debug, error, info, warn}; use log::{debug, error, info, warn};
use std::borrow::Cow; use std::borrow::Cow;
use std::io::Read; use std::path::{Path, PathBuf};
use std::path::Path;
use std::process::{Command, Stdio}; use std::process::{Command, Stdio};
#[derive(Debug, clap::Parser)] #[derive(Debug, clap::Parser)]
@ -93,10 +92,19 @@ impl Execute for Download {
.extension() .extension()
.unwrap_or_default() .unwrap_or_default()
.is_empty() .is_empty()
&& self.output != "-"
{ {
bail!("No file extension found. Please specify a file extension (via `-o`) for the output file") bail!("No file extension found. Please specify a file extension (via `-o`) for the output file")
} }
if self.subtitle.is_some() {
if let Some(ext) = Path::new(&self.output).extension() {
if ext.to_string_lossy() != "mp4" {
warn!("Detected a non mp4 output container. Adding subtitles may take a while")
}
}
}
let _ = FFmpegPreset::ffmpeg_presets(self.ffmpeg_preset.clone())?; let _ = FFmpegPreset::ffmpeg_presets(self.ffmpeg_preset.clone())?;
if self.ffmpeg_preset.len() == 1 if self.ffmpeg_preset.len() == 1
&& self.ffmpeg_preset.get(0).unwrap() == &FFmpegPreset::Nvidia && self.ffmpeg_preset.get(0).unwrap() == &FFmpegPreset::Nvidia
@ -249,7 +257,7 @@ impl Execute for Download {
&self, &self,
format.stream, format.stream,
format.subtitles.get(0).cloned(), format.subtitles.get(0).cloned(),
path.as_path(), path.to_path_buf(),
) )
.await?; .await?;
} }
@ -264,7 +272,7 @@ async fn download_ffmpeg(
download: &Download, download: &Download,
variant_data: VariantData, variant_data: VariantData,
subtitle: Option<StreamSubtitle>, subtitle: Option<StreamSubtitle>,
target: &Path, mut target: PathBuf,
) -> Result<()> { ) -> Result<()> {
let (input_presets, mut output_presets) = let (input_presets, mut output_presets) =
FFmpegPreset::ffmpeg_presets(download.ffmpeg_preset.clone())?; FFmpegPreset::ffmpeg_presets(download.ffmpeg_preset.clone())?;
@ -276,12 +284,6 @@ async fn download_ffmpeg(
} }
} }
if let Some(ext) = target.extension() {
if ext.to_string_lossy() != "mp4" && subtitle.is_some() {
warn!("Detected a non mp4 output container. Adding subtitles may take a while")
}
}
let mut video_file = tempfile(".ts")?; let mut video_file = tempfile(".ts")?;
download_segments(ctx, &mut video_file, None, variant_data).await?; download_segments(ctx, &mut video_file, None, variant_data).await?;
let subtitle_file = if let Some(ref sub) = subtitle { let subtitle_file = if let Some(ref sub) = subtitle {
@ -291,11 +293,22 @@ async fn download_ffmpeg(
None None
}; };
let subtitle_preset = if let Some(sub_file) = &subtitle_file { let stdout_tempfile = if target.to_string_lossy() == "-" {
let file = tempfile(".mp4")?;
target = file.path().to_path_buf();
Some(file)
} else {
None
};
let subtitle_presets = if let Some(sub_file) = &subtitle_file {
if target.extension().unwrap_or_default().to_string_lossy() == "mp4" { if target.extension().unwrap_or_default().to_string_lossy() == "mp4" {
vec![ vec![
"-i".to_string(), "-i".to_string(),
sub_file.to_string_lossy().to_string(), sub_file.to_string_lossy().to_string(),
"-movflags".to_string(),
"faststart".to_string(),
"-c:s".to_string(), "-c:s".to_string(),
"mov_text".to_string(), "mov_text".to_string(),
"-disposition:s:s:0".to_string(), "-disposition:s:s:0".to_string(),
@ -331,7 +344,7 @@ async fn download_ffmpeg(
.arg("-y") .arg("-y")
.args(input_presets) .args(input_presets)
.args(["-i", video_file.path().to_string_lossy().as_ref()]) .args(["-i", video_file.path().to_string_lossy().as_ref()])
.args(subtitle_preset) .args(subtitle_presets)
.args(output_presets) .args(output_presets)
.arg(target.to_str().unwrap()) .arg(target.to_str().unwrap())
.spawn()?; .spawn()?;
@ -340,6 +353,12 @@ async fn download_ffmpeg(
ffmpeg.wait()?; ffmpeg.wait()?;
info!("Output file generated"); info!("Output file generated");
if let Some(mut stdout_file) = stdout_tempfile {
let mut stdout = std::io::stdout();
std::io::copy(&mut stdout_file, &mut stdout)?;
}
Ok(()) Ok(())
} }