Merge branch 'alatiera/player-timeout' into 'master'
Player: Tweak the smart rewind behavior See merge request World/podcasts!76
This commit is contained in:
commit
6a52a2bc46
@ -8,7 +8,7 @@ use gtk::prelude::*;
|
|||||||
use gio::{File, FileExt};
|
use gio::{File, FileExt};
|
||||||
use glib::{SignalHandlerId, WeakRef};
|
use glib::{SignalHandlerId, WeakRef};
|
||||||
|
|
||||||
use chrono::NaiveTime;
|
use chrono::{prelude::*, NaiveTime};
|
||||||
use crossbeam_channel::Sender;
|
use crossbeam_channel::Sender;
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
use fragile::Fragile;
|
use fragile::Fragile;
|
||||||
@ -22,6 +22,8 @@ use utils::set_image_from_path;
|
|||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
use i18n::i18n;
|
use i18n::i18n;
|
||||||
|
|
||||||
@ -51,11 +53,13 @@ struct PlayerInfo {
|
|||||||
episode: gtk::Label,
|
episode: gtk::Label,
|
||||||
cover: gtk::Image,
|
cover: gtk::Image,
|
||||||
mpris: Arc<MprisPlayer>,
|
mpris: Arc<MprisPlayer>,
|
||||||
|
episode_id: RefCell<Option<i32>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PlayerInfo {
|
impl PlayerInfo {
|
||||||
// FIXME: create a Diesel Model of the joined episode and podcast query instead
|
// FIXME: create a Diesel Model of the joined episode and podcast query instead
|
||||||
fn init(&self, episode: &EpisodeWidgetModel, podcast: &ShowCoverModel) {
|
fn init(&self, episode: &EpisodeWidgetModel, podcast: &ShowCoverModel) {
|
||||||
|
self.episode_id.replace(Some(episode.rowid()));
|
||||||
self.set_cover_image(podcast);
|
self.set_cover_image(podcast);
|
||||||
self.set_show_title(podcast);
|
self.set_show_title(podcast);
|
||||||
self.set_episode_title(episode);
|
self.set_episode_title(episode);
|
||||||
@ -169,6 +173,7 @@ struct PlayerControls {
|
|||||||
pause: gtk::Button,
|
pause: gtk::Button,
|
||||||
forward: gtk::Button,
|
forward: gtk::Button,
|
||||||
rewind: gtk::Button,
|
rewind: gtk::Button,
|
||||||
|
last_pause: RefCell<Option<DateTime<Local>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -219,6 +224,7 @@ impl Default for PlayerWidget {
|
|||||||
pause,
|
pause,
|
||||||
forward,
|
forward,
|
||||||
rewind,
|
rewind,
|
||||||
|
last_pause: RefCell::new(None),
|
||||||
};
|
};
|
||||||
|
|
||||||
let timer_container = builder.get_object("timer").unwrap();
|
let timer_container = builder.get_object("timer").unwrap();
|
||||||
@ -248,6 +254,7 @@ impl Default for PlayerWidget {
|
|||||||
show,
|
show,
|
||||||
episode,
|
episode,
|
||||||
cover,
|
cover,
|
||||||
|
episode_id: RefCell::new(None),
|
||||||
};
|
};
|
||||||
|
|
||||||
let radio150 = builder.get_object("rate_1_50").unwrap();
|
let radio150 = builder.get_object("rate_1_50").unwrap();
|
||||||
@ -457,6 +464,36 @@ impl PlayerWidget {
|
|||||||
player.seek(ClockTime::from_seconds(value));
|
player.seek(ClockTime::from_seconds(value));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn smart_rewind(&self) -> Option<()> {
|
||||||
|
lazy_static! {
|
||||||
|
static ref LAST_KNOWN_EPISODE: Mutex<Option<i32>> = Mutex::new(None);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Figure out the time delta, in seconds, between the last pause and now
|
||||||
|
let now = Local::now();
|
||||||
|
let last: &Option<DateTime<_>> = &*self.controls.last_pause.borrow();
|
||||||
|
let last = last.clone()?;
|
||||||
|
let delta = (now - last).num_seconds();
|
||||||
|
|
||||||
|
// Get interval passed in the gst stream
|
||||||
|
let seconds_passed = self.player.get_position().seconds()?;
|
||||||
|
// get the last known episode id
|
||||||
|
let mut last = LAST_KNOWN_EPISODE.lock().unwrap();
|
||||||
|
// get the current playing episode id
|
||||||
|
let current_id = *self.info.episode_id.borrow();
|
||||||
|
// Only rewind on pause if the stream position is passed a certain point,
|
||||||
|
// and the player has been paused for more than a minute,
|
||||||
|
// and the episode id is the same
|
||||||
|
if seconds_passed >= 90 && delta >= 60 && current_id == *last {
|
||||||
|
self.seek(ClockTime::from_seconds(5), SeekDirection::Backwards);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the last knows episode to the current one
|
||||||
|
*last = current_id;
|
||||||
|
|
||||||
|
Some(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PlayerExt for PlayerWidget {
|
impl PlayerExt for PlayerWidget {
|
||||||
@ -466,6 +503,7 @@ impl PlayerExt for PlayerWidget {
|
|||||||
self.controls.pause.show();
|
self.controls.pause.show();
|
||||||
self.controls.play.hide();
|
self.controls.play.hide();
|
||||||
|
|
||||||
|
self.smart_rewind();
|
||||||
self.player.play();
|
self.player.play();
|
||||||
self.info.mpris.set_playback_status(PlaybackStatus::Playing);
|
self.info.mpris.set_playback_status(PlaybackStatus::Playing);
|
||||||
}
|
}
|
||||||
@ -477,12 +515,7 @@ impl PlayerExt for PlayerWidget {
|
|||||||
self.player.pause();
|
self.player.pause();
|
||||||
self.info.mpris.set_playback_status(PlaybackStatus::Paused);
|
self.info.mpris.set_playback_status(PlaybackStatus::Paused);
|
||||||
|
|
||||||
// Only rewind on pause if the stream position is passed a certain point.
|
self.controls.last_pause.replace(Some(Local::now()));
|
||||||
if let Some(sec) = self.player.get_position().seconds() {
|
|
||||||
if sec >= 90 {
|
|
||||||
self.seek(ClockTime::from_seconds(5), SeekDirection::Backwards);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user