11import AttachmentFrame from "./frames/attachmentFrame" ;
22import CommentsFrame from "./frames/commentsFrame" ;
3- import FrameFactory from "./frames/frameFactory" ;
43import Id3v2ExtendedHeader from "./id3v2ExtendedHeader" ;
54import Id3v2TagFooter from "./id3v2TagFooter" ;
65import Id3v2Settings from "./id3v2Settings" ;
@@ -11,6 +10,7 @@ import {ByteVector, StringType} from "../byteVector";
1110import { CorruptFileError , NotImplementedError , NotSupportedError } from "../errors" ;
1211import { File , ReadStyle } from "../file" ;
1312import { Frame , FrameClassType } from "./frames/frame" ;
13+ import { Id3v2FrameFactory } from "./frames/frameFactory" ;
1414import { FrameIdentifier , FrameIdentifiers } from "./frameIdentifiers" ;
1515import { Id3v2FrameFlags } from "./frames/frameHeader" ;
1616import { Id3v2TagHeader , Id3v2TagHeaderFlags } from "./id3v2TagHeader" ;
@@ -1394,6 +1394,7 @@ export default class Id3v2Tag extends Tag {
13941394 let frameDataEndPosition = ( data ? data . length : this . _header . tagSize ) + frameDataPosition ;
13951395
13961396 // Check for the extended header
1397+ // @TODO : Replace with NumberUtils.hasFlags
13971398 if ( ( this . _header . flags & Id3v2TagHeaderFlags . ExtendedHeader ) !== 0 ) {
13981399 this . _extendedHeader = Id3v2ExtendedHeader . fromData ( data , this . _header . majorVersion ) ;
13991400
@@ -1405,28 +1406,41 @@ export default class Id3v2Tag extends Tag {
14051406
14061407 // Parse the frames
14071408 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+ }
14151422
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.
14201437
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.
14241440
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 ;
14281443 }
1429- this . addFrame ( frame ) ;
14301444 }
14311445 }
14321446
0 commit comments