From 34468648381fefacafb3ae47640c9b70b5a59437 Mon Sep 17 00:00:00 2001 From: johannesd3 Date: Tue, 2 Feb 2021 02:18:58 +0100 Subject: [PATCH 1/4] Handle corrupt cache files (#591) --- audio/src/fetch.rs | 4 ++++ core/src/cache.rs | 13 +++++++++++++ playback/src/player.rs | 23 ++++++++++++++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/audio/src/fetch.rs b/audio/src/fetch.rs index bae6941..9f96adb 100644 --- a/audio/src/fetch.rs +++ b/audio/src/fetch.rs @@ -459,6 +459,10 @@ impl AudioFile { } } } + + pub fn is_cached(&self) -> bool { + matches!(self, AudioFile::Cached { .. }) + } } fn request_range(session: &Session, file: FileId, offset: usize, length: usize) -> Channel { diff --git a/core/src/cache.rs b/core/src/cache.rs index 00f0f40..55c9ab0 100644 --- a/core/src/cache.rs +++ b/core/src/cache.rs @@ -162,4 +162,17 @@ impl Cache { warn!("Cannot save file to cache: {}", e) } } + + pub fn remove_file(&self, file: FileId) -> bool { + if let Some(path) = self.file_path(file) { + if let Err(err) = fs::remove_file(path) { + warn!("Unable to remove file from cache: {}", err); + false + } else { + true + } + } else { + false + } + } } diff --git a/playback/src/player.rs b/playback/src/player.rs index 125184a..314311f 100644 --- a/playback/src/player.rs +++ b/playback/src/player.rs @@ -682,6 +682,7 @@ impl PlayerTrackLoader { return None; } }; + let is_cached = encrypted_file.is_cached(); let mut stream_loader_controller = encrypted_file.get_stream_loader_controller(); @@ -715,7 +716,27 @@ impl PlayerTrackLoader { let audio_file = Subfile::new(decrypted_file, 0xa7); - let mut decoder = VorbisDecoder::new(audio_file).unwrap(); + let mut decoder = match VorbisDecoder::new(audio_file) { + Ok(decoder) => decoder, + Err(e) if is_cached => { + warn!( + "Unable to read cached audio file: {}. Trying to download it.", + e + ); + + // unwrap safety: The file is cached, so session must have a cache + if !self.session.cache().unwrap().remove_file(file_id) { + return None; + } + + // Just try it again + return self.load_track(spotify_id, position_ms); + } + Err(e) => { + error!("Unable to read audio file: {}", e); + return None; + } + }; if position_ms != 0 { match decoder.seek(position_ms as i64) { From f67ceb5f6d955c800564a98f8a4098c7702e8083 Mon Sep 17 00:00:00 2001 From: johannesd3 Date: Tue, 2 Feb 2021 02:19:15 +0100 Subject: [PATCH 2/4] Small refactoring --- playback/src/player.rs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/playback/src/player.rs b/playback/src/player.rs index 314311f..e3fb037 100644 --- a/playback/src/player.rs +++ b/playback/src/player.rs @@ -651,18 +651,14 @@ impl PlayerTrackLoader { FileFormat::OGG_VORBIS_96, ], }; - let format = formats - .iter() - .find(|format| audio.files.contains_key(format)) - .unwrap(); - let file_id = match audio.files.get(&format) { - Some(&file_id) => file_id, - None => { - warn!("<{}> in not available in format {:?}", audio.name, format); - return None; - } - }; + let (format, file_id) = formats + .iter() + .find_map(|format| Some((format, *audio.files.get(&format)?))) + .or_else(|| { + warn!("<{}> is not available in any supported format", audio.name); + None + })?; let bytes_per_second = self.stream_data_rate(*format); let play_from_beginning = position_ms == 0; @@ -739,9 +735,8 @@ impl PlayerTrackLoader { }; if position_ms != 0 { - match decoder.seek(position_ms as i64) { - Ok(_) => (), - Err(err) => error!("Vorbis error: {:?}", err), + if let Err(err) = decoder.seek(position_ms as i64) { + error!("Vorbis error: {}", err); } stream_loader_controller.set_stream_mode(); } From d3495cfed4150a021b53b84f8c3ddeb17315dfd5 Mon Sep 17 00:00:00 2001 From: johannesd3 Date: Tue, 9 Feb 2021 09:14:32 +0100 Subject: [PATCH 3/4] Re-add support for Rust 1.40 --- audio/src/fetch.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/audio/src/fetch.rs b/audio/src/fetch.rs index 9f96adb..11745a2 100644 --- a/audio/src/fetch.rs +++ b/audio/src/fetch.rs @@ -461,7 +461,10 @@ impl AudioFile { } pub fn is_cached(&self) -> bool { - matches!(self, AudioFile::Cached { .. }) + match self { + AudioFile::Cached { .. } => true, + _ => false, + } } } From 2f660f74ecf66bc15cf18ea7bf317ed3a942eb8d Mon Sep 17 00:00:00 2001 From: johannesd3 Date: Tue, 9 Feb 2021 09:15:55 +0100 Subject: [PATCH 4/4] Small refactor --- playback/src/player.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/playback/src/player.rs b/playback/src/player.rs index e3fb037..8585a95 100644 --- a/playback/src/player.rs +++ b/playback/src/player.rs @@ -652,15 +652,23 @@ impl PlayerTrackLoader { ], }; - let (format, file_id) = formats - .iter() - .find_map(|format| Some((format, *audio.files.get(&format)?))) - .or_else(|| { - warn!("<{}> is not available in any supported format", audio.name); + let entry = formats.iter().find_map(|format| { + if let Some(&file_id) = audio.files.get(format) { + Some((*format, file_id)) + } else { None - })?; + } + }); - let bytes_per_second = self.stream_data_rate(*format); + let (format, file_id) = match entry { + Some(t) => t, + None => { + warn!("<{}> is not available in any supported format", audio.name); + return None; + } + }; + + let bytes_per_second = self.stream_data_rate(format); let play_from_beginning = position_ms == 0; let key = self.session.audio_key().request(spotify_id, file_id);