@@ -3,95 +3,73 @@ 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 ;
76
87use std:: borrow:: Cow ;
98use std:: io:: Read ;
109
1110pub ( crate ) fn parse_v2_header < R > (
1211 reader : & mut R ,
13- parse_mode : ParsingMode ,
1412) -> Result < Option < ( FrameId < ' static > , u32 , FrameFlags ) > >
1513where
1614 R : Read ,
1715{
18- let mut frame_header = [ 0 ; 6 ] ;
19- match reader. read_exact ( & mut frame_header ) {
16+ let mut header = [ 0 ; 6 ] ;
17+ match reader. read_exact ( & mut header ) {
2018 Ok ( _) => { } ,
2119 Err ( _) => return Ok ( None ) ,
2220 }
2321
2422 // Assume we just started reading padding
25- if frame_header [ 0 ] == 0 {
23+ if header [ 0 ] == 0 {
2624 return Ok ( None ) ;
2725 }
2826
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 ( ) )
27+ let id_bytes = & header [ ..3 ] ;
28+ let id_str = std:: str:: from_utf8 ( id_bytes )
29+ . map_err ( |_| Id3v2Error :: new ( Id3v2ErrorKind :: BadFrameId ( id_bytes . to_vec ( ) ) ) )
3230 . map ( |id_str| {
3331 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- } ;
32+ } ) ?;
33+ let id = FrameId :: new_cow ( id_str) ?;
4334
44- let size = u32:: from_be_bytes ( [ 0 , frame_header [ 3 ] , frame_header [ 4 ] , frame_header [ 5 ] ] ) ;
35+ let size = u32:: from_be_bytes ( [ 0 , header [ 3 ] , header [ 4 ] , header [ 5 ] ] ) ;
4536
4637 // V2 doesn't store flags
47- Ok ( Some ( ( frame_id , size, FrameFlags :: default ( ) ) ) )
38+ Ok ( Some ( ( id , size, FrameFlags :: default ( ) ) ) )
4839}
4940
5041pub ( crate ) fn parse_header < R > (
5142 reader : & mut R ,
5243 synchsafe : bool ,
53- parse_mode : ParsingMode ,
5444) -> Result < Option < ( FrameId < ' static > , u32 , FrameFlags ) > >
5545where
5646 R : Read ,
5747{
58- let mut frame_header = [ 0 ; 10 ] ;
59- match reader. read_exact ( & mut frame_header ) {
48+ let mut header = [ 0 ; 10 ] ;
49+ match reader. read_exact ( & mut header ) {
6050 Ok ( _) => { } ,
6151 Err ( _) => return Ok ( None ) ,
6252 }
6353
6454 // Assume we just started reading padding
65- if frame_header [ 0 ] == 0 {
55+ if header [ 0 ] == 0 {
6656 return Ok ( None ) ;
6757 }
6858
6959 // For some reason, some apps make v3 tags with v2 frame IDs.
7060 // The actual frame header is v3 though
71- let mut frame_id_end = 4 ;
61+ let mut id_end = 4 ;
7262 let mut invalid_v2_frame = false ;
73- if frame_header [ 3 ] == 0 && !synchsafe {
63+ if header [ 3 ] == 0 && !synchsafe {
7464 invalid_v2_frame = true ;
75- frame_id_end = 3 ;
65+ id_end = 3 ;
7666 }
7767
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- } ;
68+ let id_bytes = & header[ ..id_end] ;
69+ let id_str = std:: str:: from_utf8 ( id_bytes)
70+ . map_err ( |_| Id3v2Error :: new ( Id3v2ErrorKind :: BadFrameId ( id_bytes. to_vec ( ) ) ) ) ?;
8871
89- let mut size = u32:: from_be_bytes ( [
90- frame_header[ 4 ] ,
91- frame_header[ 5 ] ,
92- frame_header[ 6 ] ,
93- frame_header[ 7 ] ,
94- ] ) ;
72+ let mut size = u32:: from_be_bytes ( [ header[ 4 ] , header[ 5 ] , header[ 6 ] , header[ 7 ] ] ) ;
9573
9674 // Now upgrade the FrameId
9775 let id = if invalid_v2_frame {
@@ -105,20 +83,14 @@ where
10583 } else {
10684 Cow :: Owned ( id_str. to_owned ( ) )
10785 } ;
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- } ;
86+ let frame_id = FrameId :: new_cow ( id) ?;
11587
11688 // unsynch the frame size if necessary
11789 if synchsafe {
11890 size = size. unsynch ( ) ;
11991 }
12092
121- let flags = u16:: from_be_bytes ( [ frame_header [ 8 ] , frame_header [ 9 ] ] ) ;
93+ let flags = u16:: from_be_bytes ( [ header [ 8 ] , header [ 9 ] ] ) ;
12294 let flags = parse_flags ( flags, synchsafe) ;
12395
12496 Ok ( Some ( ( frame_id, size, flags) ) )
0 commit comments