diff options
Diffstat (limited to 'src/open_dialog.rs')
| -rw-r--r-- | src/open_dialog.rs | 58 |
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; |