aboutsummaryrefslogtreecommitdiff
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);
-}