summary refs log tree commit diff
path: root/src/open_dialog.rs
diff options
context:
space:
mode:
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;