diff options
| author | Malte Voos <git@mal.tc> | 2025-12-25 11:05:19 +0100 |
|---|---|---|
| committer | Malte Voos <git@mal.tc> | 2025-12-25 11:05:19 +0100 |
| commit | bb641f353c3dd81f5e3b16ecaf1fae669b3ac67b (patch) | |
| tree | 51def81474c6cd861fa98519c2b20b6d9f892ded | |
| parent | c347b6133365dcf1b7da4e77890b20d04d6cfba4 (diff) | |
| download | lleap-bb641f353c3dd81f5e3b16ecaf1fae669b3ac67b.tar.gz lleap-bb641f353c3dd81f5e3b16ecaf1fae669b3ac67b.zip | |
fix whisper subtitles not appearing in subtitle selection menu
| -rw-r--r-- | src/app.rs | 21 | ||||
| -rw-r--r-- | src/cue_view.rs | 3 | ||||
| -rw-r--r-- | src/player.rs | 4 | ||||
| -rw-r--r-- | src/subtitles/extraction/mod.rs | 18 | ||||
| -rw-r--r-- | src/subtitles/mod.rs | 12 | ||||
| -rw-r--r-- | src/track_selector.rs | 21 |
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); -} |