Skip to content

Commit b72485c

Browse files
Merge pull request #593 from Johannesd3/fix-issue-591
2 parents 84ba421 + 2f660f7 commit b72485c

File tree

3 files changed

+56
-12
lines changed

3 files changed

+56
-12
lines changed

audio/src/fetch.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,13 @@ impl AudioFile {
459459
}
460460
}
461461
}
462+
463+
pub fn is_cached(&self) -> bool {
464+
match self {
465+
AudioFile::Cached { .. } => true,
466+
_ => false,
467+
}
468+
}
462469
}
463470

464471
fn request_range(session: &Session, file: FileId, offset: usize, length: usize) -> Channel {

core/src/cache.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,17 @@ impl Cache {
162162
warn!("Cannot save file to cache: {}", e)
163163
}
164164
}
165+
166+
pub fn remove_file(&self, file: FileId) -> bool {
167+
if let Some(path) = self.file_path(file) {
168+
if let Err(err) = fs::remove_file(path) {
169+
warn!("Unable to remove file from cache: {}", err);
170+
false
171+
} else {
172+
true
173+
}
174+
} else {
175+
false
176+
}
177+
}
165178
}

playback/src/player.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -654,20 +654,24 @@ impl PlayerTrackLoader {
654654
FileFormat::OGG_VORBIS_96,
655655
],
656656
};
657-
let format = formats
658-
.iter()
659-
.find(|format| audio.files.contains_key(format))
660-
.unwrap();
661657

662-
let file_id = match audio.files.get(&format) {
663-
Some(&file_id) => file_id,
658+
let entry = formats.iter().find_map(|format| {
659+
if let Some(&file_id) = audio.files.get(format) {
660+
Some((*format, file_id))
661+
} else {
662+
None
663+
}
664+
});
665+
666+
let (format, file_id) = match entry {
667+
Some(t) => t,
664668
None => {
665-
warn!("<{}> in not available in format {:?}", audio.name, format);
669+
warn!("<{}> is not available in any supported format", audio.name);
666670
return None;
667671
}
668672
};
669673

670-
let bytes_per_second = self.stream_data_rate(*format);
674+
let bytes_per_second = self.stream_data_rate(format);
671675
let play_from_beginning = position_ms == 0;
672676

673677
let key = self.session.audio_key().request(spotify_id, file_id);
@@ -685,6 +689,7 @@ impl PlayerTrackLoader {
685689
return None;
686690
}
687691
};
692+
let is_cached = encrypted_file.is_cached();
688693

689694
let mut stream_loader_controller = encrypted_file.get_stream_loader_controller();
690695

@@ -718,12 +723,31 @@ impl PlayerTrackLoader {
718723

719724
let audio_file = Subfile::new(decrypted_file, 0xa7);
720725

721-
let mut decoder = VorbisDecoder::new(audio_file).unwrap();
726+
let mut decoder = match VorbisDecoder::new(audio_file) {
727+
Ok(decoder) => decoder,
728+
Err(e) if is_cached => {
729+
warn!(
730+
"Unable to read cached audio file: {}. Trying to download it.",
731+
e
732+
);
733+
734+
// unwrap safety: The file is cached, so session must have a cache
735+
if !self.session.cache().unwrap().remove_file(file_id) {
736+
return None;
737+
}
738+
739+
// Just try it again
740+
return self.load_track(spotify_id, position_ms);
741+
}
742+
Err(e) => {
743+
error!("Unable to read audio file: {}", e);
744+
return None;
745+
}
746+
};
722747

723748
if position_ms != 0 {
724-
match decoder.seek(position_ms as i64) {
725-
Ok(_) => (),
726-
Err(err) => error!("Vorbis error: {:?}", err),
749+
if let Err(err) = decoder.seek(position_ms as i64) {
750+
error!("Vorbis error: {}", err);
727751
}
728752
stream_loader_controller.set_stream_mode();
729753
}

0 commit comments

Comments
 (0)