aboutsummaryrefslogtreecommitdiff
path: root/src/open_dialog.rs
diff options
context:
space:
mode:
authorMalte Voos <git@mal.tc>2025-12-05 15:35:38 +0100
committerMalte Voos <git@mal.tc>2025-12-05 15:43:58 +0100
commitc347b6133365dcf1b7da4e77890b20d04d6cfba4 (patch)
treec83aac6f7d1e6edc57e607f01e5d3eeee8da4a0e /src/open_dialog.rs
parent652b1c2a0ce7db4885ebc51f7f09133a43401442 (diff)
downloadlleap-c347b6133365dcf1b7da4e77890b20d04d6cfba4.tar.gz
lleap-c347b6133365dcf1b7da4e77890b20d04d6cfba4.zip
implement machine translation; various fixes and refactorings
Diffstat (limited to 'src/open_dialog.rs')
-rw-r--r--src/open_dialog.rs58
1 files changed, 39 insertions, 19 deletions
diff --git a/src/open_dialog.rs b/src/open_dialog.rs
index 2f17c59..3b822be 100644
--- a/src/open_dialog.rs
+++ b/src/open_dialog.rs
@@ -5,10 +5,10 @@ use gtk::gio;
use gtk::glib::clone;
use relm4::prelude::*;
+use crate::subtitles::{MetadataCollection, StreamIndex, TrackMetadata};
use crate::track_selector::{
TrackInfo, TrackSelector, TrackSelectorInit, TrackSelectorMsg, TrackSelectorOutput,
};
-use crate::tracks::{StreamIndex, TrackMetadata};
use crate::util::Tracker;
pub struct OpenDialog {
@@ -23,6 +23,7 @@ pub struct OpenDialog {
whisper_stream_index: Option<StreamIndex>,
metadata_command_running: bool,
+ metadata: Option<MetadataCollection>,
}
#[derive(Debug)]
@@ -34,7 +35,7 @@ pub enum OpenDialogMsg {
FileSelected(gio::File),
UrlChanged(String),
SetDoWhisperExtraction(bool),
- WhisperTrackSelected(Option<StreamIndex>),
+ WhisperTrackSelected(StreamIndex),
Play,
}
@@ -42,6 +43,7 @@ pub enum OpenDialogMsg {
pub enum OpenDialogOutput {
Play {
url: String,
+ metadata: MetadataCollection,
whisper_stream_index: Option<StreamIndex>,
},
}
@@ -51,7 +53,7 @@ impl Component for OpenDialog {
type Init = adw::ApplicationWindow;
type Input = OpenDialogMsg;
type Output = OpenDialogOutput;
- type CommandOutput = Result<BTreeMap<StreamIndex, TrackMetadata>, ffmpeg::Error>;
+ type CommandOutput = Result<MetadataCollection, ffmpeg::Error>;
view! {
#[root]
@@ -186,6 +188,7 @@ impl Component for OpenDialog {
whisper_stream_index: None,
metadata_command_running: false,
+ metadata: None,
};
let widgets = view_output!();
@@ -227,23 +230,28 @@ impl Component for OpenDialog {
self.url.set(file.uri().into());
}
OpenDialogMsg::Play => {
- sender
- .output(OpenDialogOutput::Play {
- url: self.url.get().clone(),
- whisper_stream_index: if self.do_whisper_extraction {
- self.whisper_stream_index
- } else {
- None
- },
- })
- .unwrap();
- self.dialog.close();
+ if let Some(ref metadata) = self.metadata {
+ sender
+ .output(OpenDialogOutput::Play {
+ url: self.url.get().clone(),
+ metadata: metadata.clone(),
+ whisper_stream_index: if self.do_whisper_extraction {
+ self.whisper_stream_index
+ } else {
+ None
+ },
+ })
+ .unwrap();
+ self.dialog.close();
+ } else {
+ log::error!("metadata is unavailable, can't play");
+ }
}
OpenDialogMsg::SetDoWhisperExtraction(val) => {
self.do_whisper_extraction = val;
}
OpenDialogMsg::WhisperTrackSelected(track_index) => {
- self.whisper_stream_index = track_index;
+ self.whisper_stream_index = Some(track_index);
}
}
}
@@ -259,10 +267,10 @@ impl Component for OpenDialog {
self.metadata_command_running = false;
match message {
- Ok(audio_tracks) => {
+ Ok(metadata) => {
let list_model = gio::ListStore::new::<TrackInfo>();
- for (&stream_index, track) in audio_tracks.iter() {
+ for (&stream_index, track) in metadata.audio.iter() {
let track_info = TrackInfo::new(
stream_index,
track.language.map(|lang| lang.to_name()),
@@ -276,6 +284,8 @@ impl Component for OpenDialog {
.send(TrackSelectorMsg::SetListModel(list_model))
.unwrap();
+ self.metadata = Some(metadata);
+
self.next();
}
Err(e) => {
@@ -302,7 +312,7 @@ impl OpenDialog {
sender.spawn_oneshot_command(move || {
let input = ffmpeg::format::input(&url)?;
- let audio_tracks = input
+ let audio = input
.streams()
.filter_map(|stream| {
if stream.parameters().medium() == ffmpeg::media::Type::Audio {
@@ -312,8 +322,18 @@ impl OpenDialog {
}
})
.collect::<BTreeMap<_, _>>();
+ let subtitles = input
+ .streams()
+ .filter_map(|stream| {
+ if stream.parameters().medium() == ffmpeg::media::Type::Subtitle {
+ Some((stream.index(), TrackMetadata::from_ffmpeg_stream(&stream)))
+ } else {
+ None
+ }
+ })
+ .collect::<BTreeMap<_, _>>();
- Ok(audio_tracks)
+ Ok(MetadataCollection { audio, subtitles })
});
self.metadata_command_running = true;