Player: Tweak the smart rewind behavior

Check if time interval passed since the last pause, and only
rewind if the delta to indicates that the user had
switched their focus.

In other words, avoid rewinding if the track was just paused and
resumed.
This commit is contained in:
Jordan Petridis 2018-09-30 06:42:53 +03:00 committed by Jordan Petridis
parent 43fce2e89a
commit e13b8b8827

View File

@ -8,7 +8,7 @@ use gtk::prelude::*;
use gio::{File, FileExt};
use glib::{SignalHandlerId, WeakRef};
use chrono::NaiveTime;
use chrono::{prelude::*, NaiveTime};
use crossbeam_channel::Sender;
use failure::Error;
use fragile::Fragile;
@ -22,6 +22,7 @@ use utils::set_image_from_path;
use std::ops::Deref;
use std::path::Path;
use std::rc::Rc;
use std::cell::RefCell;
use i18n::i18n;
@ -169,6 +170,7 @@ struct PlayerControls {
pause: gtk::Button,
forward: gtk::Button,
rewind: gtk::Button,
last_pause: RefCell<Option<DateTime<Local>>>,
}
#[derive(Debug, Clone)]
@ -219,6 +221,7 @@ impl Default for PlayerWidget {
pause,
forward,
rewind,
last_pause: RefCell::new(None),
};
let timer_container = builder.get_object("timer").unwrap();
@ -457,6 +460,23 @@ impl PlayerWidget {
player.seek(ClockTime::from_seconds(value));
})
}
fn smart_rewind(&self) -> Option<()> {
let now = Local::now();
let last: &Option<DateTime<_>> = &*self.controls.last_pause.borrow();
let last = last.clone()?;
let delta = (now - last).num_seconds();
// Only rewind on pause if the stream position is passed a certain point,
// And the player has been paused for more than a minute.
let seconds_passed = self.player.get_position().seconds()?;
// FIXME: also check episode id
if seconds_passed >= 90 && delta >= 60 {
self.seek(ClockTime::from_seconds(5), SeekDirection::Backwards);
}
Some(())
}
}
impl PlayerExt for PlayerWidget {
@ -466,6 +486,7 @@ impl PlayerExt for PlayerWidget {
self.controls.pause.show();
self.controls.play.hide();
self.smart_rewind();
self.player.play();
self.info.mpris.set_playback_status(PlaybackStatus::Playing);
}
@ -477,12 +498,7 @@ impl PlayerExt for PlayerWidget {
self.player.pause();
self.info.mpris.set_playback_status(PlaybackStatus::Paused);
// Only rewind on pause if the stream position is passed a certain point.
if let Some(sec) = self.player.get_position().seconds() {
if sec >= 90 {
self.seek(ClockTime::from_seconds(5), SeekDirection::Backwards);
}
}
self.controls.last_pause.replace(Some(Local::now()));
}
#[cfg_attr(rustfmt, rustfmt_skip)]