@@ -3,95 +3,73 @@ use crate::error::{Id3v2Error, Id3v2ErrorKind, Result};
3
3
use crate :: id3:: v2:: util:: synchsafe:: SynchsafeInteger ;
4
4
use crate :: id3:: v2:: util:: upgrade:: { upgrade_v2, upgrade_v3} ;
5
5
use crate :: id3:: v2:: FrameId ;
6
- use crate :: ParsingMode ;
7
6
8
7
use std:: borrow:: Cow ;
9
8
use std:: io:: Read ;
10
9
11
10
pub ( crate ) fn parse_v2_header < R > (
12
11
reader : & mut R ,
13
- parse_mode : ParsingMode ,
14
12
) -> Result < Option < ( FrameId < ' static > , u32 , FrameFlags ) > >
15
13
where
16
14
R : Read ,
17
15
{
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 ) {
20
18
Ok ( _) => { } ,
21
19
Err ( _) => return Ok ( None ) ,
22
20
}
23
21
24
22
// Assume we just started reading padding
25
- if frame_header [ 0 ] == 0 {
23
+ if header [ 0 ] == 0 {
26
24
return Ok ( None ) ;
27
25
}
28
26
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 ( ) ) ) )
32
30
. map ( |id_str| {
33
31
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) ?;
43
34
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 ] ] ) ;
45
36
46
37
// V2 doesn't store flags
47
- Ok ( Some ( ( frame_id , size, FrameFlags :: default ( ) ) ) )
38
+ Ok ( Some ( ( id , size, FrameFlags :: default ( ) ) ) )
48
39
}
49
40
50
41
pub ( crate ) fn parse_header < R > (
51
42
reader : & mut R ,
52
43
synchsafe : bool ,
53
- parse_mode : ParsingMode ,
54
44
) -> Result < Option < ( FrameId < ' static > , u32 , FrameFlags ) > >
55
45
where
56
46
R : Read ,
57
47
{
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 ) {
60
50
Ok ( _) => { } ,
61
51
Err ( _) => return Ok ( None ) ,
62
52
}
63
53
64
54
// Assume we just started reading padding
65
- if frame_header [ 0 ] == 0 {
55
+ if header [ 0 ] == 0 {
66
56
return Ok ( None ) ;
67
57
}
68
58
69
59
// For some reason, some apps make v3 tags with v2 frame IDs.
70
60
// The actual frame header is v3 though
71
- let mut frame_id_end = 4 ;
61
+ let mut id_end = 4 ;
72
62
let mut invalid_v2_frame = false ;
73
- if frame_header [ 3 ] == 0 && !synchsafe {
63
+ if header [ 3 ] == 0 && !synchsafe {
74
64
invalid_v2_frame = true ;
75
- frame_id_end = 3 ;
65
+ id_end = 3 ;
76
66
}
77
67
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 ( ) ) ) ) ?;
88
71
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 ] ] ) ;
95
73
96
74
// Now upgrade the FrameId
97
75
let id = if invalid_v2_frame {
@@ -105,20 +83,14 @@ where
105
83
} else {
106
84
Cow :: Owned ( id_str. to_owned ( ) )
107
85
} ;
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) ?;
115
87
116
88
// unsynch the frame size if necessary
117
89
if synchsafe {
118
90
size = size. unsynch ( ) ;
119
91
}
120
92
121
- let flags = u16:: from_be_bytes ( [ frame_header [ 8 ] , frame_header [ 9 ] ] ) ;
93
+ let flags = u16:: from_be_bytes ( [ header [ 8 ] , header [ 9 ] ] ) ;
122
94
let flags = parse_flags ( flags, synchsafe) ;
123
95
124
96
Ok ( Some ( ( frame_id, size, flags) ) )
0 commit comments