@@ -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