about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMalte Voos <git@mal.tc>2025-12-25 11:05:19 +0100
committerMalte Voos <git@mal.tc>2025-12-25 11:05:19 +0100
commitbb641f353c3dd81f5e3b16ecaf1fae669b3ac67b (patch)
tree51def81474c6cd861fa98519c2b20b6d9f892ded
parentc347b6133365dcf1b7da4e77890b20d04d6cfba4 (diff)
downloadlleap-bb641f353c3dd81f5e3b16ecaf1fae669b3ac67b.tar.gz
lleap-bb641f353c3dd81f5e3b16ecaf1fae669b3ac67b.zip
fix whisper subtitles not appearing in subtitle selection menu
-rw-r--r--src/app.rs21
-rw-r--r--src/cue_view.rs3
-rw-r--r--src/player.rs4
-rw-r--r--src/subtitles/extraction/mod.rs18
-rw-r--r--src/subtitles/mod.rs12
-rw-r--r--src/track_selector.rs21
6 files changed, 24 insertions, 55 deletions
diff --git a/src/app.rs b/src/app.rs
index bdb2ef9..49efd49 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -13,6 +13,7 @@ use crate::{
     subtitle_view::{SubtitleView, SubtitleViewMsg, SubtitleViewOutput},
     subtitles::{
         MetadataCollection, SUBTITLE_TRACKS, StreamIndex, SubtitleCue, SubtitleTrack,
+        TrackMetadata,
         extraction::{SubtitleExtractor, SubtitleExtractorMsg, SubtitleExtractorOutput},
         state::SubtitleState,
     },
@@ -181,8 +182,8 @@ impl SimpleComponent for App {
             AppMsg::AddCue(stream_ix, cue) => {
                 SUBTITLE_TRACKS
                     .write()
-                    .get_mut(&stream_ix)
-                    .unwrap()
+                    .entry(stream_ix)
+                    .or_insert(SubtitleTrack::default())
                     .push_cue(cue.clone());
 
                 self.transcript
@@ -245,9 +246,23 @@ impl SimpleComponent for App {
             }
             AppMsg::Play {
                 url,
-                metadata,
+                mut metadata,
                 whisper_stream_index,
             } => {
+                if let Some(ix) = whisper_stream_index {
+                    let audio_metadata = metadata.audio.get(&ix).unwrap();
+                    let subs_metadata = TrackMetadata {
+                        language: audio_metadata.language,
+                        title: Some(match &audio_metadata.title {
+                            Some(title) => {
+                                format!("Auto-generated from audio (Whisper): {}", title)
+                            }
+                            None => "Auto-generated from audio (Whisper)".to_string(),
+                        }),
+                    };
+                    metadata.subtitles.insert(ix, subs_metadata);
+                }
+
                 self.player
                     .sender()
                     .send(PlayerMsg::SetUrl(url.clone()))
diff --git a/src/cue_view.rs b/src/cue_view.rs
index 05c45c4..7ffe43e 100644
--- a/src/cue_view.rs
+++ b/src/cue_view.rs
@@ -9,7 +9,6 @@ use relm4::{ComponentParts, SimpleComponent};
 use unicode_segmentation::UnicodeSegmentation;
 
 use crate::subtitles::state::CueAddress;
-use crate::translation::TRANSLATIONS;
 use crate::util::Tracker;
 
 pub struct ActiveCueViewState {
@@ -155,7 +154,7 @@ impl SimpleComponent for CueView {
 
         if let (
             Some(ActiveCueViewState {
-                addr: CueAddress(stream_ix, cue_ix),
+                addr: CueAddress(_stream_ix, _cue_ix),
                 text: _,
                 word_ranges,
             }),
diff --git a/src/player.rs b/src/player.rs
index df45571..d533f48 100644
--- a/src/player.rs
+++ b/src/player.rs
@@ -186,9 +186,9 @@ impl SimpleComponent for Player {
 
                     match play_message {
                         PlayMessage::Error(error_msg) => {
-                            eprintln!("Playback error: {:?}", error_msg.error());
+                            log::error!("Playback error: {:?}", error_msg.error());
                             if let Some(details) = error_msg.details() {
-                                eprintln!("Error details: {:?}", details);
+                                log::error!("Error details: {:?}", details);
                             }
                         }
                         PlayMessage::PositionUpdated(pos) => {
diff --git a/src/subtitles/extraction/mod.rs b/src/subtitles/extraction/mod.rs
index b012658..5070fdb 100644
--- a/src/subtitles/extraction/mod.rs
+++ b/src/subtitles/extraction/mod.rs
@@ -8,7 +8,7 @@ use std::{collections::BTreeMap, sync::mpsc, thread};
 use ffmpeg::Rational;
 use relm4::{ComponentSender, Worker};
 
-use crate::subtitles::{SUBTITLE_TRACKS, StreamIndex, SubtitleCue, SubtitleTrack, TrackMetadata};
+use crate::subtitles::{SUBTITLE_TRACKS, StreamIndex, SubtitleCue};
 
 pub struct SubtitleExtractor {}
 
@@ -86,11 +86,6 @@ impl SubtitleExtractor {
             let stream_ix = stream.index();
 
             if stream.parameters().medium() == ffmpeg::media::Type::Subtitle {
-                let metadata = TrackMetadata::from_ffmpeg_stream(&stream);
-                let track = SubtitleTrack::new(metadata);
-
-                SUBTITLE_TRACKS.write().insert(stream_ix, track);
-
                 let context = ffmpeg::codec::Context::from_parameters(stream.parameters())?;
                 let (packet_tx, packet_rx) = mpsc::channel();
                 let time_base = stream.time_base();
@@ -107,17 +102,6 @@ impl SubtitleExtractor {
 
         if let Some(stream_ix) = whisper_audio_stream_ix {
             let stream = input.stream(stream_ix).unwrap();
-
-            let mut metadata = TrackMetadata::from_ffmpeg_stream(&stream);
-            metadata.title = Some(match metadata.title {
-                Some(title) => format!("Auto-generated from audio (Whisper): {}", title),
-                None => "Auto-generated from audio (Whisper)".to_string(),
-            });
-
-            let track = SubtitleTrack::new(metadata);
-
-            SUBTITLE_TRACKS.write().insert(stream_ix, track);
-
             let context = ffmpeg::codec::Context::from_parameters(stream.parameters())?;
             let (packet_tx, packet_rx) = mpsc::channel();
             let time_base = stream.time_base();
diff --git a/src/subtitles/mod.rs b/src/subtitles/mod.rs
index a545d52..acb73dc 100644
--- a/src/subtitles/mod.rs
+++ b/src/subtitles/mod.rs
@@ -26,9 +26,8 @@ pub struct SubtitleCue {
     pub end_time: gst::ClockTime,
 }
 
-#[derive(Debug, Clone)]
+#[derive(Default, Debug, Clone)]
 pub struct SubtitleTrack {
-    pub metadata: TrackMetadata,
     // SoA of cue text, start timestamp, end timestamp
     pub texts: Vec<String>,
     pub start_times: Vec<gst::ClockTime>,
@@ -50,15 +49,6 @@ impl TrackMetadata {
 }
 
 impl SubtitleTrack {
-    pub fn new(metadata: TrackMetadata) -> Self {
-        Self {
-            metadata,
-            texts: Vec::new(),
-            start_times: Vec::new(),
-            end_times: Vec::new(),
-        }
-    }
-
     pub fn push_cue(&mut self, cue: SubtitleCue) {
         let SubtitleCue {
             text,
diff --git a/src/track_selector.rs b/src/track_selector.rs
index ce04d07..0d3391f 100644
--- a/src/track_selector.rs
+++ b/src/track_selector.rs
@@ -2,7 +2,7 @@ use adw::prelude::*;
 use gtk::{gio, glib};
 use relm4::prelude::*;
 
-use crate::{subtitles::StreamIndex, util::Tracker};
+use crate::subtitles::StreamIndex;
 
 glib::wrapper! {
     pub struct TrackInfo(ObjectSubclass<imp::TrackInfo>);
@@ -88,14 +88,9 @@ impl SimpleComponent for TrackSelector {
             set_factory: Some(&track_factory),
             #[watch]
             set_model: Some(&model.track_list_model),
-            // #[watch]
-            // set_selected: model.track_ix.map_or(gtk::INVALID_LIST_POSITION, |ix| get_list_ix_from_stream_ix(&model.track_list_model, ix)),
             connect_selected_notify[sender] => move |combo| {
                 if let Some(stream_ix) = get_stream_ix_from_combo(combo) {
-                    println!("selected {}", stream_ix);
                     sender.input(TrackSelectorMsg::Changed(stream_ix));
-                } else {
-                    println!("selected none");
                 }
             },
         },
@@ -166,7 +161,6 @@ impl SimpleComponent for TrackSelector {
                 self.track_list_model = list_model;
             }
             TrackSelectorMsg::Changed(track_ix) => {
-                println!("changed {:?}", track_ix);
                 self.track_ix = Some(track_ix);
                 sender
                     .output(TrackSelectorOutput::Changed(track_ix))
@@ -185,16 +179,3 @@ fn get_stream_ix_from_combo(combo: &adw::ComboRow) -> Option<StreamIndex> {
 
     Some(ix)
 }
-
-fn get_list_ix_from_stream_ix(list_model: &gio::ListStore, stream_ix: StreamIndex) -> u32 {
-    for i in 0..list_model.n_items() {
-        if let Some(item) = list_model.item(i) {
-            if let Some(track_info) = item.downcast_ref::<TrackInfo>() {
-                if track_info.get_stream_index() == stream_ix {
-                    return i;
-                }
-            }
-        }
-    }
-    panic!("Stream index {} not found in list model", stream_ix);
-}