feat(player,core): remember the audio/subtitle track by name across episodes

A track picked on one episode now carries over to the next by its title as
well as its language, so e.g. "Signs & Songs" vs "Full" subtitles in the same
language stick. Catalog migration V8 adds the title columns; the Android
bridge keeps a stored title only while its language is unchanged.
This commit is contained in:
nvrl committed 2026-09-15 13:54:07 +02:00
1 parent ad24557588
commit d3c5f071fb
7 files changed
+312 -32

No files matched your search

+18 -11
View File
@@ -866,28 +866,35 @@ impl App {
Action::SelectTrack { kind, id } => {
self.send_player(crate::playback::Command::SelectTrack(kind, id));
// Remember the *language*, not the track number: the next
// episode is a different file, where track 3 may be a
// commentary and Japanese may be track 2.
let language = id.and_then(|id| {
self.playback.as_ref().and_then(|playback| {
playback
.tracks_of(kind)
.find(|track| track.id == id)
.and_then(|track| track.language.clone())
// Remember the language and the track's name, not its number:
// the next episode is a different file, where track 3 may be a
// commentary and Japanese may be track 2. The name is what
// tells "Signs & Songs" from "Full Subtitles" in one language.
let (language, title) = id
.and_then(|id| {
self.playback.as_ref().and_then(|playback| {
playback
.tracks_of(kind)
.find(|track| track.id == id)
.map(|track| (track.language.clone(), track.title.clone()))
})
})
});
.unwrap_or_default();
if let Some(playback) = &self.playback {
let mut show = self
.engine
.title_track_prefs(&playback.target.title_key)
.unwrap_or_default();
match kind {
pstr_player::TrackKind::Audio => show.audio_language = language,
pstr_player::TrackKind::Audio => {
show.audio_language = language;
show.audio_title = title;
}
pstr_player::TrackKind::Subtitle => {
show.subtitles = id.is_some();
if id.is_some() {
show.subtitle_language = language;
show.subtitle_title = title;
}
}
pstr_player::TrackKind::Video => {}