Skip to content

Commit 9fc65c6

Browse files
authored
cleanup event module and implement follow-up support for podcast (#619)
1 parent d21e9c6 commit 9fc65c6

File tree

7 files changed

+144
-90
lines changed

7 files changed

+144
-90
lines changed

spotify_player/src/client/handlers.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use super::ClientRequest;
1414

1515
struct PlayerEventHandlerState {
1616
add_track_to_queue_req_timer: std::time::Instant,
17+
get_context_timer: std::time::Instant,
1718
}
1819

1920
/// starts the client's request handler
@@ -112,6 +113,7 @@ fn handle_playback_change_event(
112113
fn handle_page_change_event(
113114
state: &SharedState,
114115
client_pub: &flume::Sender<ClientRequest>,
116+
handler_state: &mut PlayerEventHandlerState,
115117
) -> anyhow::Result<()> {
116118
match state.ui.lock().current_page_mut() {
117119
PageState::Context {
@@ -124,8 +126,10 @@ fn handle_page_change_event(
124126
ContextPageType::CurrentPlaying => state.player.read().playing_context_id(),
125127
};
126128

127-
// update the context state and request new data when moving to a new context page
128-
if *id != expected_id {
129+
let new_id = if *id == expected_id {
130+
false
131+
} else {
132+
// update the context state and request new data when moving to a new context page
129133
tracing::info!("Current context ID ({:?}) is different from the expected ID ({:?}), update the context state", id, expected_id);
130134

131135
*id = expected_id;
@@ -145,14 +149,21 @@ fn handle_page_change_event(
145149
*page_state = None;
146150
}
147151
}
148-
}
152+
true
153+
};
149154

150155
// request new context's data if not found in memory
156+
// To avoid making too many requests, only request if context id is changed
157+
// or it's been a while since the last request.
151158
if let Some(id) = id {
152159
if !matches!(id, ContextId::Tracks(_))
153160
&& !state.data.read().caches.context.contains_key(&id.uri())
161+
&& (new_id
162+
|| handler_state.get_context_timer.elapsed()
163+
> std::time::Duration::from_secs(5))
154164
{
155165
client_pub.send(ClientRequest::GetContext(id.clone()))?;
166+
handler_state.get_context_timer = std::time::Instant::now();
156167
}
157168
}
158169
}
@@ -190,7 +201,8 @@ fn handle_player_event(
190201
client_pub: &flume::Sender<ClientRequest>,
191202
handler_state: &mut PlayerEventHandlerState,
192203
) -> anyhow::Result<()> {
193-
handle_page_change_event(state, client_pub).context("handle page change event")?;
204+
handle_page_change_event(state, client_pub, handler_state)
205+
.context("handle page change event")?;
194206
handle_playback_change_event(state, client_pub, handler_state)
195207
.context("handle playback change event")?;
196208

@@ -228,6 +240,7 @@ pub async fn start_player_event_watchers(
228240
let refresh_duration = std::time::Duration::from_secs(1);
229241
let mut handler_state = PlayerEventHandlerState {
230242
add_track_to_queue_req_timer: std::time::Instant::now(),
243+
get_context_timer: std::time::Instant::now(),
231244
};
232245

233246
loop {

spotify_player/src/client/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -880,12 +880,13 @@ impl Client {
880880
self.start_context_playback(PlayContextId::from(id), device_id, offset, None)
881881
.await?;
882882
}
883+
ContextId::Show(id) => {
884+
self.start_context_playback(PlayContextId::from(id), device_id, offset, None)
885+
.await?;
886+
}
883887
ContextId::Tracks(_) => {
884888
anyhow::bail!("`StartPlayback` request for `tracks` context is not supported")
885889
}
886-
ContextId::Show(_) => {
887-
anyhow::bail!("`StartPlayback` request for `show` context is not supported")
888-
}
889890
},
890891
Playback::URIs(ids, offset) => {
891892
self.start_uris_playback(ids, device_id, offset, None)

spotify_player/src/event/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ pub fn start_event_handler(state: &SharedState, client_pub: &flume::Sender<Clien
3838
if let Err(err) = match event {
3939
crossterm::event::Event::Mouse(event) => handle_mouse_event(event, client_pub, state),
4040
crossterm::event::Event::Resize(columns, rows) => {
41-
let mut state = state.ui.lock();
42-
state.orientation = Orientation::from_size(columns, rows);
41+
state.ui.lock().orientation = Orientation::from_size(columns, rows);
4342
Ok(())
4443
}
4544
crossterm::event::Event::Key(event) => {
@@ -55,7 +54,7 @@ pub fn start_event_handler(state: &SharedState, client_pub: &flume::Sender<Clien
5554
}
5655
_ => Ok(()),
5756
} {
58-
tracing::error!("Failed to handle event: {err:#}");
57+
tracing::error!("Failed to handle terminal event: {err:#}");
5958
}
6059
}
6160
}
@@ -475,7 +474,7 @@ fn handle_show_actions_on_artist(
475474
}
476475

477476
/// Handle a global action, currently this is only used to target
478-
/// the currently playing song instead of the selection.
477+
/// the currently playing item instead of the selection.
479478
fn handle_global_action(
480479
action: Action,
481480
target: ActionTarget,

spotify_player/src/event/page.rs

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -57,24 +57,24 @@ fn handle_action_for_library_page(
5757
match focus_state {
5858
LibraryFocusState::Playlists => window::handle_action_for_selected_item(
5959
action,
60-
ui.search_filtered_items(&data.user_data.folder_playlists_items(folder_id))
60+
&ui.search_filtered_items(&data.user_data.folder_playlists_items(folder_id))
6161
.into_iter()
6262
.copied()
63-
.collect(),
63+
.collect::<Vec<_>>(),
6464
&data,
6565
ui,
6666
client_pub,
6767
),
6868
LibraryFocusState::SavedAlbums => window::handle_action_for_selected_item(
6969
action,
70-
ui.search_filtered_items(&data.user_data.saved_albums),
70+
&ui.search_filtered_items(&data.user_data.saved_albums),
7171
&data,
7272
ui,
7373
client_pub,
7474
),
7575
LibraryFocusState::FollowedArtists => window::handle_action_for_selected_item(
7676
action,
77-
ui.search_filtered_items(&data.user_data.followed_artists),
77+
&ui.search_filtered_items(&data.user_data.followed_artists),
7878
&data,
7979
ui,
8080
client_pub,
@@ -98,28 +98,30 @@ fn handle_command_for_library_page(
9898
_ => anyhow::bail!("expect a library page state"),
9999
};
100100
match focus_state {
101-
LibraryFocusState::Playlists => window::handle_command_for_playlist_list_window(
101+
LibraryFocusState::Playlists => Ok(window::handle_command_for_playlist_list_window(
102102
command,
103-
ui.search_filtered_items(&data.user_data.folder_playlists_items(folder_id))
103+
&ui.search_filtered_items(&data.user_data.folder_playlists_items(folder_id))
104104
.into_iter()
105105
.copied()
106-
.collect(),
106+
.collect::<Vec<_>>(),
107107
&data,
108108
ui,
109-
),
109+
)),
110110
LibraryFocusState::SavedAlbums => window::handle_command_for_album_list_window(
111111
command,
112-
ui.search_filtered_items(&data.user_data.saved_albums),
112+
&ui.search_filtered_items(&data.user_data.saved_albums),
113113
&data,
114114
ui,
115115
client_pub,
116116
),
117-
LibraryFocusState::FollowedArtists => window::handle_command_for_artist_list_window(
118-
command,
119-
ui.search_filtered_items(&data.user_data.followed_artists),
120-
&data,
121-
ui,
122-
),
117+
LibraryFocusState::FollowedArtists => {
118+
Ok(window::handle_command_for_artist_list_window(
119+
command,
120+
&ui.search_filtered_items(&data.user_data.followed_artists),
121+
&data,
122+
ui,
123+
))
124+
}
123125
}
124126
}
125127
}
@@ -171,75 +173,74 @@ fn handle_key_sequence_for_search_page(
171173
match focus_state {
172174
SearchFocusState::Input => anyhow::bail!("user's search input should be handled before"),
173175
SearchFocusState::Tracks => {
174-
let tracks = match search_results {
175-
Some(s) => s.tracks.iter().collect(),
176-
None => Vec::new(),
177-
};
176+
let tracks = search_results
177+
.map(|s| s.tracks.iter().collect::<Vec<_>>())
178+
.unwrap_or_default();
178179

179180
match found_keymap {
180181
CommandOrAction::Command(command) => window::handle_command_for_track_list_window(
181-
command, client_pub, tracks, &data, ui,
182+
command, client_pub, &tracks, &data, ui,
182183
),
183184
CommandOrAction::Action(action, ActionTarget::SelectedItem) => {
184-
window::handle_action_for_selected_item(action, tracks, &data, ui, client_pub)
185+
window::handle_action_for_selected_item(action, &tracks, &data, ui, client_pub)
185186
}
186187
CommandOrAction::Action(..) => Ok(false),
187188
}
188189
}
189190
SearchFocusState::Artists => {
190191
let artists = search_results
191-
.map(|s| s.artists.iter().collect())
192+
.map(|s| s.artists.iter().collect::<Vec<_>>())
192193
.unwrap_or_default();
193194

194195
match found_keymap {
195-
CommandOrAction::Command(command) => {
196-
window::handle_command_for_artist_list_window(command, artists, &data, ui)
197-
}
196+
CommandOrAction::Command(command) => Ok(
197+
window::handle_command_for_artist_list_window(command, &artists, &data, ui),
198+
),
198199
CommandOrAction::Action(action, ActionTarget::SelectedItem) => {
199-
window::handle_action_for_selected_item(action, artists, &data, ui, client_pub)
200+
window::handle_action_for_selected_item(action, &artists, &data, ui, client_pub)
200201
}
201202
CommandOrAction::Action(..) => Ok(false),
202203
}
203204
}
204205
SearchFocusState::Albums => {
205206
let albums = search_results
206-
.map(|s| s.albums.iter().collect())
207+
.map(|s| s.albums.iter().collect::<Vec<_>>())
207208
.unwrap_or_default();
208209

209210
match found_keymap {
210211
CommandOrAction::Command(command) => window::handle_command_for_album_list_window(
211-
command, albums, &data, ui, client_pub,
212+
command, &albums, &data, ui, client_pub,
212213
),
213214
CommandOrAction::Action(action, ActionTarget::SelectedItem) => {
214-
window::handle_action_for_selected_item(action, albums, &data, ui, client_pub)
215+
window::handle_action_for_selected_item(action, &albums, &data, ui, client_pub)
215216
}
216217
CommandOrAction::Action(..) => Ok(false),
217218
}
218219
}
219220
SearchFocusState::Playlists => {
220-
let playlists: Vec<PlaylistFolderItem> = search_results
221+
let playlists = search_results
221222
.map(|s| {
222223
s.playlists
223224
.iter()
224225
.map(|p| PlaylistFolderItem::Playlist(p.clone()))
225-
.collect()
226+
.collect::<Vec<_>>()
226227
})
227228
.unwrap_or_default();
228-
let playlist_refs = playlists.iter().collect();
229+
let playlist_refs = playlists.iter().collect::<Vec<_>>();
229230

230231
match found_keymap {
231232
CommandOrAction::Command(command) => {
232-
window::handle_command_for_playlist_list_window(
233+
Ok(window::handle_command_for_playlist_list_window(
233234
command,
234-
playlist_refs,
235+
&playlist_refs,
235236
&data,
236237
ui,
237-
)
238+
))
238239
}
239240
CommandOrAction::Action(action, ActionTarget::SelectedItem) => {
240241
window::handle_action_for_selected_item(
241242
action,
242-
playlist_refs,
243+
&playlist_refs,
243244
&data,
244245
ui,
245246
client_pub,
@@ -258,7 +259,7 @@ fn handle_key_sequence_for_search_page(
258259
window::handle_command_for_show_list_window(command, &shows, &data, ui),
259260
),
260261
CommandOrAction::Action(action, ActionTarget::SelectedItem) => {
261-
window::handle_action_for_selected_item(action, shows, &data, ui, client_pub)
262+
window::handle_action_for_selected_item(action, &shows, &data, ui, client_pub)
262263
}
263264
CommandOrAction::Action(..) => Ok(false),
264265
}
@@ -276,7 +277,9 @@ fn handle_key_sequence_for_search_page(
276277
)
277278
}
278279
CommandOrAction::Action(action, ActionTarget::SelectedItem) => {
279-
window::handle_action_for_selected_item(action, episodes, &data, ui, client_pub)
280+
window::handle_action_for_selected_item(
281+
action, &episodes, &data, ui, client_pub,
282+
)
280283
}
281284
CommandOrAction::Action(..) => Ok(false),
282285
}

0 commit comments

Comments
 (0)