@@ -3,12 +3,14 @@ use crate::error::{Id3v2Error, Id3v2ErrorKind, Result};
33use crate :: id3:: v2:: util:: synchsafe:: SynchsafeInteger ;
44use crate :: id3:: v2:: util:: upgrade:: { upgrade_v2, upgrade_v3} ;
55use crate :: id3:: v2:: FrameId ;
6+ use crate :: ParsingMode ;
67
78use std:: borrow:: Cow ;
89use std:: io:: Read ;
910
1011pub ( crate ) fn parse_v2_header < R > (
1112 reader : & mut R ,
13+ parse_mode : ParsingMode ,
1214) -> Result < Option < ( FrameId < ' static > , u32 , FrameFlags ) > >
1315where
1416 R : Read ,
@@ -24,12 +26,20 @@ where
2426 return Ok ( None ) ;
2527 }
2628
27- let frame_id = & frame_header[ ..3 ] ;
28- let id_str = std:: str:: from_utf8 ( frame_id)
29- . map_err ( |_| Id3v2Error :: new ( Id3v2ErrorKind :: BadFrameId ( frame_id. to_vec ( ) ) ) ) ?;
30- let id = upgrade_v2 ( id_str) . map_or_else ( || Cow :: Owned ( id_str. to_owned ( ) ) , Cow :: Borrowed ) ;
31-
32- let frame_id = FrameId :: new_cow ( id) ?;
29+ let frame_id_bytes = & frame_header[ ..3 ] ;
30+ let frame_id = match std:: str:: from_utf8 ( frame_id_bytes)
31+ . map_err ( |_| Id3v2Error :: new ( Id3v2ErrorKind :: BadFrameId ( frame_id_bytes. to_vec ( ) ) ) . into ( ) )
32+ . map ( |id_str| {
33+ upgrade_v2 ( id_str) . map_or_else ( || Cow :: Owned ( id_str. to_owned ( ) ) , Cow :: Borrowed )
34+ } )
35+ . and_then ( FrameId :: new_cow)
36+ {
37+ Ok ( id) => id,
38+ Err ( err) => match parse_mode {
39+ ParsingMode :: Strict => return Err ( err) ,
40+ ParsingMode :: BestAttempt | ParsingMode :: Relaxed => return Ok ( None ) ,
41+ } ,
42+ } ;
3343
3444 let size = u32:: from_be_bytes ( [ 0 , frame_header[ 3 ] , frame_header[ 4 ] , frame_header[ 5 ] ] ) ;
3545
4050pub ( crate ) fn parse_header < R > (
4151 reader : & mut R ,
4252 synchsafe : bool ,
53+ parse_mode : ParsingMode ,
4354) -> Result < Option < ( FrameId < ' static > , u32 , FrameFlags ) > >
4455where
4556 R : Read ,
6475 frame_id_end = 3 ;
6576 }
6677
67- let frame_id = & frame_header[ ..frame_id_end] ;
68- let id_str = std:: str:: from_utf8 ( & frame_header[ ..frame_id_end] )
69- . map_err ( |_| Id3v2Error :: new ( Id3v2ErrorKind :: BadFrameId ( frame_id. to_vec ( ) ) ) ) ?;
78+ let frame_id_bytes = & frame_header[ ..frame_id_end] ;
79+ let id_str = match std:: str:: from_utf8 ( frame_id_bytes)
80+ . map_err ( |_| Id3v2Error :: new ( Id3v2ErrorKind :: BadFrameId ( frame_id_bytes. to_vec ( ) ) ) . into ( ) )
81+ {
82+ Ok ( id_str) => id_str,
83+ Err ( err) => match parse_mode {
84+ ParsingMode :: Strict => return Err ( err) ,
85+ ParsingMode :: BestAttempt | ParsingMode :: Relaxed => return Ok ( None ) ,
86+ } ,
87+ } ;
7088
7189 let mut size = u32:: from_be_bytes ( [
7290 frame_header[ 4 ] ,
@@ -87,7 +105,13 @@ where
87105 } else {
88106 Cow :: Owned ( id_str. to_owned ( ) )
89107 } ;
90- let frame_id = FrameId :: new_cow ( id) ?;
108+ let frame_id = match FrameId :: new_cow ( id) {
109+ Ok ( frame_id) => frame_id,
110+ Err ( err) => match parse_mode {
111+ ParsingMode :: Strict => return Err ( err) ,
112+ ParsingMode :: BestAttempt | ParsingMode :: Relaxed => return Ok ( None ) ,
113+ } ,
114+ } ;
91115
92116 // unsynch the frame size if necessary
93117 if synchsafe {
0 commit comments