feat: add ability to choose video codec

This commit is contained in:
uku 2025-05-18 22:55:08 +02:00
parent 8f3c7e4052
commit 299ad0c9dc
Signed by: uku
SSH key fingerprint: SHA256:4P0aN6M8ajKukNi6aPOaX0LacanGYtlfjmN+m/sHY/o
2 changed files with 61 additions and 16 deletions

View file

@ -44,6 +44,7 @@ impl Config {
enum Message {
OpenFilePicker,
SetOutFilename(String),
SetOutCodec(String),
SetMergeTracks(bool),
SetFolder(ZiplineFolder),
StartTheProcess,
@ -83,6 +84,7 @@ struct UploadInfo {
config: Config,
video_path: Option<PathBuf>,
out_filename: Option<String>,
out_codec: ffmpeg::Codec,
merge_tracks: bool,
folder: Option<ZiplineFolder>,
}
@ -94,6 +96,7 @@ struct Tyrolienne {
total: usize,
video_path: Option<PathBuf>,
out_filename: Option<String>,
out_codec: ffmpeg::Codec,
merge_tracks: bool,
folder: Option<ZiplineFolder>,
dialog: Controller<Dialog>,
@ -112,6 +115,7 @@ impl Tyrolienne {
UploadInfo {
config: self.config.clone(),
out_filename: self.out_filename.clone(),
out_codec: self.out_codec,
merge_tracks: self.merge_tracks,
video_path: self.video_path.clone(),
folder: self.folder.clone(),
@ -170,6 +174,20 @@ impl AsyncComponent for Tyrolienne {
connect_changed[sender] => move |e| sender.input(Message::SetOutFilename(e.text().into())),
},
adw::ComboRow {
set_title: "Output video codec",
set_model: Some(&gtk::StringList::new(&["VP9", "AV1"])),
connect_selected_item_notify[sender] => move |r| {
println!("{:?}", r.selected_item());
if let Some(item) = r
.selected_item()
.and_then(|i| i.downcast::<gtk::StringObject>().ok())
{
sender.input(Message::SetOutCodec(item.into()));
}
}
},
adw::SwitchRow {
set_title: "Merge audio tracks",
set_active: true,
@ -180,7 +198,7 @@ impl AsyncComponent for Tyrolienne {
set_title: "Zipline folder",
set_model: Some(&folder_store),
set_expression: Some(&folder_expression),
connect_activated[sender] => move |r| {
connect_selected_item_notify[sender] => move |r| {
if let Some(item) = r
.selected_item()
.and_then(|i| i.downcast::<GtkZiplineFolder>().ok())
@ -230,6 +248,7 @@ impl AsyncComponent for Tyrolienne {
total: 1,
video_path: None,
out_filename: None,
out_codec: ffmpeg::Codec::VP9,
merge_tracks: true,
folder: None,
dialog: Dialog::builder()
@ -293,6 +312,7 @@ impl AsyncComponent for Tyrolienne {
Message::SetOutFilename(name) => {
self.out_filename = if name.is_empty() { None } else { Some(name) }
}
Message::SetOutCodec(codec) => self.out_codec = codec.into(),
Message::SetMergeTracks(m) => self.merge_tracks = m,
Message::SetFolder(folder) => {
self.folder = (folder.id != GtkZiplineFolder::NONE_ID).then_some(folder)
@ -406,7 +426,14 @@ async fn the_process(app: UploadInfo, sender: &Sender<ProgressMessage>) -> Resul
let video_meta = ffmpeg::get_video_meta(video_path).await?;
sender.emit(ProgressMessage::SetTotal(video_meta.duration_us));
let out_path = ffmpeg::convert_video(video_path, sender.clone()).await?;
let out_path = ffmpeg::convert_video(
video_path,
app.out_filename,
app.out_codec,
app.merge_tracks,
sender.clone(),
)
.await?;
sender.emit(ProgressMessage::SetStep(Step::Uploading));
if let Some(folder) = app.folder.as_ref() {