1
1
import AttachmentFrame from "./frames/attachmentFrame" ;
2
2
import CommentsFrame from "./frames/commentsFrame" ;
3
- import FrameFactory from "./frames/frameFactory" ;
4
3
import Id3v2ExtendedHeader from "./id3v2ExtendedHeader" ;
5
4
import Id3v2TagFooter from "./id3v2TagFooter" ;
6
5
import Id3v2Settings from "./id3v2Settings" ;
@@ -11,6 +10,7 @@ import {ByteVector, StringType} from "../byteVector";
11
10
import { CorruptFileError , NotImplementedError , NotSupportedError } from "../errors" ;
12
11
import { File , ReadStyle } from "../file" ;
13
12
import { Frame , FrameClassType } from "./frames/frame" ;
13
+ import { Id3v2FrameFactory } from "./frames/frameFactory" ;
14
14
import { FrameIdentifier , FrameIdentifiers } from "./frameIdentifiers" ;
15
15
import { Id3v2FrameFlags } from "./frames/frameHeader" ;
16
16
import { Id3v2TagHeader , Id3v2TagHeaderFlags } from "./id3v2TagHeader" ;
@@ -1394,6 +1394,7 @@ export default class Id3v2Tag extends Tag {
1394
1394
let frameDataEndPosition = ( data ? data . length : this . _header . tagSize ) + frameDataPosition ;
1395
1395
1396
1396
// Check for the extended header
1397
+ // @TODO : Replace with NumberUtils.hasFlags
1397
1398
if ( ( this . _header . flags & Id3v2TagHeaderFlags . ExtendedHeader ) !== 0 ) {
1398
1399
this . _extendedHeader = Id3v2ExtendedHeader . fromData ( data , this . _header . majorVersion ) ;
1399
1400
@@ -1405,28 +1406,41 @@ export default class Id3v2Tag extends Tag {
1405
1406
1406
1407
// Parse the frames
1407
1408
while ( frameDataPosition < frameDataEndPosition ) {
1408
- const frameRead = FrameFactory . createFrame (
1409
- data ,
1410
- file ,
1411
- frameDataPosition ,
1412
- this . _header . majorVersion ,
1413
- fullTagUnsync
1414
- ) ;
1409
+ try {
1410
+ const frameRead = Id3v2FrameFactory . createFrame (
1411
+ data ,
1412
+ file ,
1413
+ frameDataPosition ,
1414
+ this . _header . majorVersion ,
1415
+ fullTagUnsync
1416
+ ) ;
1417
+
1418
+ // If the frame factory returned undefined, that means we've hit the end of frames
1419
+ if ( ! frameRead ) {
1420
+ break ;
1421
+ }
1415
1422
1416
- // If the frame factory returned undefined, that means we've hit the end of frames
1417
- if ( ! frameRead ) {
1418
- break ;
1419
- }
1423
+ // We found a frame, deconstruct the read result
1424
+ const frame = frameRead . frame ;
1425
+ frameDataPosition = frameRead . offset ;
1426
+
1427
+ // Only add frames that contain data
1428
+ if ( ! frame || frame . size === 0 ) {
1429
+ continue ;
1430
+ }
1431
+ this . addFrame ( frame ) ;
1432
+ } catch ( e : unknown ) {
1433
+ // If we fail at any point while trying to read the frames of the tag, we will have
1434
+ // lost our place in the file and will have to give up reading the tag.
1435
+ // Ok, technically we could use some heuristics to try to recover (eg, Foobar can
1436
+ // do this), but it is a lot of effort for minimal reward.
1420
1437
1421
- // We found a frame, deconstruct the read result
1422
- const frame = frameRead . frame ;
1423
- frameDataPosition = frameRead . offset ;
1438
+ // NOTE: It's important to not let this error propagate to the file level, else
1439
+ // the user will not be able to recover the file.
1424
1440
1425
- // Only add frames that contain data
1426
- if ( ! frame || frame . size === 0 ) {
1427
- continue ;
1441
+ // this.markCorrupt(e); @TODO: Add corruption reasons.
1442
+ break ;
1428
1443
}
1429
- this . addFrame ( frame ) ;
1430
1444
}
1431
1445
}
1432
1446
0 commit comments